Пример #1
0
        public async Task ReadAsync(
            Stream stream,
            IRTMPContentSink sink,
            CancellationToken cancel_token)
        {
            int len = 0;
            var bin = new byte[13];

            try {
                len += await stream.ReadBytesAsync(bin, len, 13 - len, cancel_token).ConfigureAwait(false);
            }
            catch (EndOfStreamException) {
                return;
            }
            var header = new FLVFileHeader(bin);

            if (!header.IsValid)
            {
                throw new BadDataException();
            }
            sink.OnFLVHeader(header);
            len = 0;

            bool eos = false;

            while (!eos)
            {
                try {
                    len += await stream.ReadBytesAsync(bin, len, 11 - len, cancel_token).ConfigureAwait(false);

                    var read_valid = false;
                    var body       = new FLVTag(this, bin);
                    if (body.IsValidHeader)
                    {
                        if (await body.ReadTagBodyAsync(stream, cancel_token).ConfigureAwait(false))
                        {
                            len        = 0;
                            read_valid = true;
                            switch (body.Type)
                            {
                            case FLVTag.TagType.Audio:
                                sink.OnAudio(body.ToRTMPMessage());
                                break;

                            case FLVTag.TagType.Video:
                                sink.OnVideo(body.ToRTMPMessage());
                                break;

                            case FLVTag.TagType.Script:
                                sink.OnData(new DataAMF0Message(body.ToRTMPMessage()));
                                break;
                            }
                        }
                    }
                    else
                    {
                        len += await stream.ReadBytesAsync(bin, len, 13 - len, cancel_token).ConfigureAwait(false);

                        var new_header = new FLVFileHeader(bin);
                        if (new_header.IsValid)
                        {
                            read_valid = true;
                            sink.OnFLVHeader(header);
                        }
                    }
                    if (!read_valid)
                    {
                        int pos = 1;
                        for (; pos < len; pos++)
                        {
                            var b = bin[pos];
                            if ((b & 0xC0) == 0 && ((b & 0x1F) == 8 || (b & 0x1F) == 9 || (b & 0x1F) == 18))
                            {
                                break;
                            }
                        }
                        if (pos == len)
                        {
                            len = 0;
                        }
                        else
                        {
                            Array.Copy(bin, pos, bin, 0, len - pos);
                            len -= pos;
                        }
                    }
                }
                catch (EndOfStreamException) {
                    eos = true;
                }
            }
        }
Пример #2
0
    public async Task ReadAsync(
      Stream stream,
      IRTMPContentSink sink,
      CancellationToken cancel_token)
    {
      int len = 0;
      var bin = new byte[13];
      try {
        len += await stream.ReadBytesAsync(bin, len, 13-len, cancel_token);
      }
      catch (EndOfStreamException) {
        return;
      }
      var header = new FileHeader(bin);
      if (!header.IsValid) throw new BadDataException();
      sink.OnFLVHeader();
      len = 0;

      bool eos = false;
      while (!eos) {
        try {
          len += await stream.ReadBytesAsync(bin, len, 11-len, cancel_token);
          var read_valid = false;
          var body = new FLVTag(this, bin);
          if (body.IsValidHeader) {
            if (await body.ReadTagBodyAsync(stream, cancel_token)) {
              len = 0;
              read_valid = true;
              switch (body.Type) {
              case FLVTag.TagType.Audio:
                sink.OnAudio(body.ToRTMPMessage());
                break;
              case FLVTag.TagType.Video:
                sink.OnVideo(body.ToRTMPMessage());
                break;
              case FLVTag.TagType.Script:
                sink.OnData(new DataAMF0Message(body.ToRTMPMessage()));
                break;
              }
            }
          }
          else {
            len += await stream.ReadBytesAsync(bin, len, 13-len, cancel_token);
            var new_header = new FileHeader(bin);
            if (new_header.IsValid) {
              read_valid = true;
              sink.OnFLVHeader();
            }
          }
          if (!read_valid) {
            int pos = 1;
            for (; pos<len; pos++) {
              var b = bin[pos];
              if ((b & 0xC0)==0 && ((b & 0x1F)==8 || (b & 0x1F)==9 || (b & 0x1F)==18)) {
                break;
              }
            }
            if (pos==len) {
              len = 0;
            }
            else {
              Array.Copy(bin, pos, bin, 0, len-pos);
              len -= pos;
            }
          }
        }
        catch (EndOfStreamException) {
          eos = true;
        }
      }

    }