FFMPEG: как обернуть поток h264 в контейнер FLV?

Чего я хочу, так это просто: обернуть видеопоток H.264 в FLV-контейнер. Однако ffmpeg просто декодирует входной поток и упаковывает необработанный видеопоток в FLV. Подробности описаны ниже:

Входной поток захватывается с видеокамеры с аппаратным кодировщиком, а FLV будет отправлен на какой-либо видеосервер. Сначала я использовал следующую команду:

$ ffmpeg -framerate 15 -s 320x240 -i /dev/video1 -f flv "rtmp://some.website.com/receive/path"

Однако результирующий поток вызывает подозрения. Наблюдающая сторона ничего не понимает в H.264. Затем я сделал тест, записав вывод в локальные файлы.

1: Чтение необработанного потока, кодирование с помощью h264_omx, запись в FLV-файл:

$ ffmpeg -framerate 15 -s 320x240 -i /dev/video0 -codec h264_omx -f flv raw_input_h264_omx.flv

......
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 194017.870905, bitrate: 18432 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 320x240, 18432 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_omx))
......

2: Чтение потока H264, запись в FLV-файл:

$ ffmpeg -framerate 15 -s 320x240 -i /dev/video1  -f flv h264_input.flv

......
Input #0, video4linux2,v4l2, from '/dev/video1':
  Duration: N/A, start: 194610.307096, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuv420p(progressive), 320x240, 15 fps, 15 tbr, 1000k tbn, 2000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> flv1 (flv))
......

Затем прочитайте два файла соответственно:

$ ffmpeg -i raw_input_h264_omx.flv
......
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 320x240, 200 kb/s, 15 fps, 15 tbr, 1k tbn

$ ffmpeg -i h264_input.flv
......
    Stream #0:0: Video: flv1, yuv420p, 320x240, 200 kb/s, 15 fps, 15 tbr, 1k tbn

Понятно, когда я даю поток H.264, ffmpeg сначала его декодирует, а затем упаковывает сырое видео в FLV. Как этого избежать и напрямую упаковать поток H.264?

Дополнение: в конечном итоге я буду передавать несколько видеопотоков, поэтому не просите меня разрешить тихое декодирование ffmpeg и снова кодировать поток.


person jiandingzhe    schedule 06.07.2017    source источник


Ответы (1)


Если не указано иное, ffmpeg будет транскодировать потоки.

Использовать

ffmpeg -framerate 15 -s 320x240 -i /dev/video1 -c copy -f flv "rtmp://website/receive/path"
person Gyan    schedule 06.07.2017