Extract Audio from FLV stream in C#

前端 未结 1 935
旧时难觅i
旧时难觅i 2020-12-29 00:24

I\'d like to extract audio stream from a FLV stream in C#. I searched in Google and I found FLVExtract, but it supports only extracting from FLV files, and not from streams.

1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2020-12-29 00:58

    I didn't find anything, so I had to write it myself. It is very fast and it's working great. Here's the code:

        protected byte[] ExtractAudio(Stream stream)
        {
            var reader = new BinaryReader(stream);
    
            // Is stream a Flash Video stream
            if (reader.ReadChar() != 'F' || reader.ReadChar() != 'L' || reader.ReadChar() != 'V')
                throw new IOException("The file is not a FLV file.");
    
            // Is audio stream exists in the video stream
            var version = reader.ReadByte();
            var exists = reader.ReadByte();
    
            if ((exists != 5) && (exists != 4))
                throw new IOException("No Audio Stream");
    
            reader.ReadInt32(); // data offset of header. ignoring
    
            var output = new List();
    
            while (true)
            {
                try
                {
                    reader.ReadInt32(); // PreviousTagSize0 skipping
    
                    var tagType = reader.ReadByte();
    
                    while (tagType != 8)
                    {
                        var skip = ReadNext3Bytes(reader) + 11;
                        reader.BaseStream.Position += skip;
    
                        tagType = reader.ReadByte();
                    }
    
                    var DataSize = ReadNext3Bytes(reader);
    
                    reader.ReadInt32(); //skip timestamps 
                    ReadNext3Bytes(reader); // skip streamID
                    reader.ReadByte(); // skip audio header
    
                    for (int i = 0; i < DataSize - 1; i++)
                        output.Add(reader.ReadByte());
                }
                catch
                {
                    break;
                }
            }
    
            return output.ToArray();
        }
    
        private long ReadNext3Bytes(BinaryReader reader)
        {
            try
            {
                return Math.Abs((reader.ReadByte() & 0xFF) * 256 * 256 + (reader.ReadByte() & 0xFF)
                    * 256 + (reader.ReadByte() & 0xFF));
            }
            catch
            {
                return 0;
            }
        }
    

    0 讨论(0)
提交回复
热议问题