Извлечь аудио из потока FLV в С#

Я хотел бы извлечь аудиопоток из потока FLV на С#. Я искал в Google и нашел FLVExtract, но он поддерживает извлечение только из файлов FLV, а не из потоков.

Как я могу это сделать?


person Alon Gubkin    schedule 07.11.2009    source источник
comment
В каком формате аудио результаты? мп3?   -  person Charles    schedule 02.11.2012


Ответы (1)


Я ничего не нашел, поэтому мне пришлось написать это самому. Это очень быстро и отлично работает. Вот код:

    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<byte>();

        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;
        }
    }
person Alon Gubkin    schedule 07.11.2009
comment
У меня есть FLV-видео с аудиопотоком, но оно не работает. - person greatmajestics; 11.05.2014
comment
Не могли бы вы помочь мне с этим... Алон Губкин. Код, который вы указали выше, не работает. - person greatmajestics; 11.05.2014