LINUX.ORG.RU

Сообщения bpkarton

 

Задержки при перекодировании видеопотока в ffmpeg «на лету»

Стоит задача: получение потока от источника (отдает кодек H264), перекодирование в формат WebM (VP8, Vorbis) и раздача realtime на веб-странице. Использование сторонних плееров и плагинов не допускается (вывод в тег <video>). Критичен вопрос задержек видео, по сути - это живая трансляция по схеме «один ко многим».

Гуглил и пробовал различные технологии, по тем или иным причинам они не устраивают (HLS, DASH, nginx + rtmp_module), пробую сейчас ffmpeg с захватом /dev/video0 (для тестирования локально):

ffmpeg -i /dev/video0 -c:v libvpx -f webm -s 640x480 -an -
Запускаю ffmpeg как child_process в NodeJS, подхватываю stdout и раздаю его через небольшой express-сервер на том же NodeJS. Вот фрагмент:
http.createServer(function (req, res) {
    res.writeHead(200, {
        'Content-Type': 'video/webm',
        'Connection': 'keep-alive'
    });

    ffmpeg.stdout.pipe(res);
}).listen(httpPort);
Видео на страницу вывожу следующим образом:
<video autoplay preload="none">
   <source src="http://<IP-address>:<Port>/stream" type='video/webm;codecs="vp8,vorbis"' />
</video>
При этом видео проигрывается (Chrome, Firefox), как и требуется, но с очень значительной задержкой (от 5 секунд). По ощущениям - как будто поток где-то буферизуется и выдается с отставанием. Чем позже подключаешься к серверу, тем большее отставание он демонстрирует. Различные опции ffmpeg пробовал, ощутимой разницы не дали. Как я понимаю, на выделенном физическом компе вопрос производительности железа не стоит, сама процедура перекодирования занимает незначительное время, да и работает он не на пределе сил.

Вопрос: возможно ли с помощью ffmpeg решить эту задачу? Если да, то какие опции нужно подобрать, чтобы минимизировать задержку и приблизить выходной видеопоток к realtime? Если нет, то что можно использовать в данном случае?

 ,

bpkarton
()

RSS подписка на новые темы