Как изменить мою команду FFMPEG, чтобы сделать мои потоки HTTP Live более эффективными?
Я хочу уменьшить накладные расходы при создании файлов .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
Существует проблема, связанная с мультиплексированием, которое приводит к добавлению большого количества накладных расходов в потоки. Вот как проблема была описана мне для аудио:
![enter image description here]()
Таким образом, для данного потока aac издержки будут 88% (так как 200 байтов будут сопоставлены с 2 x 188 байтовыми пакетами).
Для видео пакеты iframe довольно большие, поэтому они хорошо транслируются в пакеты .ts, однако различия могут быть такими же маленькими, как и у аудиопакета, поэтому они страдают от той же проблемы.
Решение состоит в том, чтобы объединить несколько пакетов aac в один больший поток перед упаковкой их в .ts. Это возможно из коробки с FFMPEG?
Ответы
Ответ 1
Это не. Кодеки полагаются на инкапсулирующий контейнер для кадрирования, что означает сигнализацию начала и длины кадра.
Ваша графика фактически пропускает элемент, который является пакетом PES. Ваш звуковой фрейм сначала будет помещен в пакет PES (который указывает его длина), тогда пакет PES будет разрезан на меньшие фрагменты, которые будут TS-пакетами.
По дизайну вы не можете запустить новый пакет PES (содержащий звуковой фрейм в вашем случае) в пакете TS, который уже содержит данные. Новый пакет PES всегда будет запускаться в новом пакете TS. В противном случае было бы невозможно начать играть в средние потоки (трансляция) - было бы невозможно узнать, на каком байте в TS начинается новый PES (помните, что вы пропустили начало текущей PES).
Есть некоторые смягчающие факторы, дополнение FF FF FF
, вероятно, будет сжато сетевым оборудованием. Также, если вы используете HTTP (вместо UDP или RDP), сжатие gzip может быть включено (но я сомневаюсь, что это очень помогло).
Ответ 2
Я исправил худшую проблему синхронизации вывода TS на каждом кадре в http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=75c8d7c2b4972f6ba2cef605949f57322f7c0361 - попробуйте версию после этого.