Как мне изменить мою команду FFMPEG, чтобы сделать мои HTTP Live Streams более эффективными?
Я хочу уменьшить накладные расходы при создании файлов.ts с помощью FFMPEG.
Я использую FFMPEG для создания серии файлов транспортного потока, используемых для потоковой передачи по HTTP.
./ffmpeg -i myInputFile.ismv \
-vcodec copy \
-acodec copy \
-bsf h264_mp4toannexb \
-map 0 \
-f segment \
-segment_time 10\
-segment_list_size 999999 \
-segment_list output/myVarientPlaylist.m3u8 \
-segment_format mpegts \
output/myAudioVideoFile-%04d.ts
Мой ввод в формате ismv и содержит видео и аудио поток:
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 348 kb/s, 29.97 tbr, 10000k tbn, 59.94 tbc
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 63 kb/s
Существует проблема, связанная с мультиплексированием, которое приводит к добавлению большого количества накладных расходов в потоки. Вот как проблема была описана мне для аудио:
Таким образом, для данного потока aac издержки будут 88% (так как 200 байтов будут сопоставлены с 2 x 188 байтовыми пакетами).
Для видео пакеты iframe довольно большие, поэтому они хорошо транслируются в пакеты.ts, однако различия могут быть такими же маленькими, как и у аудиопакета, поэтому они страдают от той же проблемы.
Решение состоит в том, чтобы объединить несколько пакетов aac в один больший поток перед упаковкой их в.ts. Возможно ли это из коробки с FFMPEG?
2 ответа
Это невозможно. Кодеки полагаются на инкапсулирующий контейнер для кадрирования, что означает сигнализацию о начале и длине кадра.
Ваша графика фактически пропускает элемент, который является пакетом PES. Ваш аудио кадр будет сначала помещен в пакет PES (который указывает его длину), затем пакет PES будет разрезан на более мелкие куски, которые будут пакетами TS.
По замыслу вы не можете запустить новый пакет PES (содержащий аудио кадр в вашем случае) в пакете TS, который уже содержит данные. Новый пакет PES всегда будет начинаться с нового пакета TS. В противном случае было бы невозможно начать воспроизведение в среднем потоке (широковещательное размещение) - невозможно было бы узнать, с какого байта в TS начинается новый PES (помните, что вы пропустили начало текущего PES).
Есть некоторые смягчающие факторы, FF FF FF
заполнение, вероятно, будет сжато сетевым оборудованием. Также, если вы используете HTTP (вместо UDP или RDP), можно включить сжатие gzip (но я сомневаюсь, что это сильно поможет).
Я исправил наихудшую проблему с синхронизацией вывода TS для каждого кадра в http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=75c8d7c2b4972f6ba2cef605949f57322f7c0361 - пожалуйста, попробуйте версию после этого.