Как сгенерировать поток FLV из необработанного h264, который можно воспроизвести с помощью ActionScript NetStream?

У меня проблема с созданием потока FLV. Я разработал систему DVR, которая должна иметь возможность передавать потоковое видео в формате FLV (для воспроизведения в ActionScript NetStream). Я получаю видео от кодировщика в необработанных единицах H264 NAL (0x00 0x00 0x00 0x01), также я могу распознать кодированный кадр IDR или не-IDR.

Мое решение для создания потока FLV (на основе спецификации Adobe: спецификация формата видеофайла версии 10) было:

  1. ждать кадра IDR;
  2. поместите заголовок FLV
  3. положить PrevTagSize (0)
  4. поместите тег FLV с тегом видео VIDEODATA с AVCVIDEODATA
  5. поставить PrevTagSize
  6. повторите шаги 4,5 до конца потоковой передачи.

Stream выглядит хорошо и может воспроизводиться с помощью ffplay, mplayer, vlc и т. Д., Но не воспроизводится плеером на основе ActionScript NetStream.

Итак, я получил необработанные данные h264 и преобразовал их в FLV с помощью ffmpeg:

ffmpeg -f h264 -i d1.h264 -vcodec copy -f flv d1.flv

и попробуйте сравнить как flv my, так и ffmpeg.

Прежде всего я вижу, что ffmpeg добавляет заголовок последовательности AVC сразу после заголовка FLV. Я начал делать то же самое, но NetStream все еще не поддерживает мой поток, а также другие игроки перестали его воспроизводить.

Хорошо, тогда я продолжаю сравнивать FLV. Теперь я вижу, что заголовки блоков NAL в FLV, закодированном ffmpeg, немного изменились, но я не могу понять, в чем смысл этих изменений. Я прочитал много спецификаций, но ничего полезного. Кто-нибудь может мне это прояснить?

Например, мои блоки NAL выглядят так: 00 00 00 01 XX XX ... - для всех блоков

NAL FFmpeg: 00 00 [14 BA] 61 9A ... - без IDR (двухбайтовая переменная) 00 00 [7A 02] 65 88 ... - IDR (двухбайтовая переменная) 00 00 00 40 06 05 ... - SEI

Добавлен какой-нибудь счетчик или еще что-нибудь?

Будем рады любым идеям, ссылкам и т. Д.


person Pyih    schedule 08.08.2012    source источник
comment
Я тоже работаю над мультиплексором FLV и задаюсь вопросом, как сохранить данные x264_nal_t ​​*, которые я получил при кодировании с использованием x264_encoder_encode. У вас получился поток работать? можешь немного объяснить свой подход?   -  person pollux    schedule 12.10.2012


Ответы (2)


Существует два распространенных формата упаковки битового потока H.264.

  1. Приложение B содержит стартовые коды: 00 00 01
  2. MP4 имеет префикс длины XX XX XX XX

Вы создаете приложение B, но похоже, что вам нужен формат упаковки mp4 (с префиксом длины) для FLV. Вам нужно удалить (00) 00 00 01 и добавить длину в качестве префикса.

person Markus Schumann    schedule 20.08.2012

Попробуйте использовать следующую команду для работы:

ffmpeg -y -i test.flv -vcodec copy -vbsf h264_mp4toannexb test.h264

У вас будет файл .h264 для воспроизведения vlc, все NAL начинаются с 00 00 00 01.

person Ken    schedule 24.10.2012