ffmpeg: вывод mpegts с помощью одной программы, содержащей 1 аудио и 3 видео

382
BobC

Я пытаюсь создать имитированный живой HLS / DASH-сервер, используя эквивалент следующей цепочки:

tsplay -loop multi_resolution.ts | shaka_packager | nginx 

Проблема заключается в создании файла "multi_resolution.ts": он должен содержать одну программу с 1 аудио и 3 видео PID, по одному для 720p, 480p и 360p. Зачем? Потому что так должно быть у shaka_packager.

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

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \ -c:a aac -ac 2 -b:a:0 128k \ -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \ -vsync cfr -x264-params "nal-hrd=cbr" \ -b:v:1 5000k -minrate 2000k -maxrate 2000k -bufsize 4000k -g 30 -s 1280x720 \ -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \ -vsync cfr -x264-params "nal-hrd=cbr" \ -b:v:2 1500k -minrate 1000k -maxrate 1000k -bufsize 2000k -g 30 -s 854x480 \ -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \ -vsync cfr -x264-params "nal-hrd=cbr" \ -b:v:3 500k -minrate 500k -maxrate 500k -bufsize 1000k -g 30 -s 640x360 \ -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \ -f mpegts "big_buck_bunny_720_480_360.ts" 

Я проверил каждую из кодировок по отдельности, и они выглядят хорошо. Я подозреваю, что проблема с моим управлением потоком / отображением.

Помогите?

2

1 ответ на вопрос

2
Gyan

Чтобы вставить несколько потоков в вывод, каждый входной поток должен быть явно отображен. Опции кодирования сами по себе не создают назначение потока в выходных данных. Существует вопрос автоматического выбора потока, который здесь не применим, но вы можете прочитать об этом на https://ffmpeg.org/ffmpeg.html#Stream-selection

Так,

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \ -map 0:a -map 0:v -map 0:v -map 0:v \ -c:a aac -ac 2 -b:a 128k \ -s:v:0 1280x720 -s:v:1 854x480-s:v:2 640x360 \ -g 30 -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \ -vsync cfr -x264-params "nal-hrd=cbr" \ -b:v:0 5000k -minrate:v:0 2000k -maxrate:v:0 2000k -bufsize:v:0 4000k \ -b:v:1 1500k -minrate:v:1 1000k -maxrate:v:1 1000k -bufsize:v:1 2000k \ -b:v:2 500k -minrate:v:2 500k -maxrate:v:2 500k -bufsize:v:2 1000k \ -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \ -f mpegts "big_buck_bunny_720_480_360.ts" 
Ах, поэтому я создаю отображение * в начале *, а затем накладываю его на другое содержимое. Однако мне все еще нужно выполнить 3 кодирования для разных разрешений, а не только для разных скоростей передачи. и мой ": n" идет после -c: v, а не -b: v, верно? BobC 5 лет назад 0
size, codec, bitrate - все параметры для каждого потока, поэтому для каждого выходного потока параметр должен быть установлен с ключом `-option: stream_type: index` Gyan 5 лет назад 0
Я снова запутался: допустим, я хотел добавить наложение текста. Можно ли применить его к одному видеопотоку перед отображением, чтобы оно содержалось в каждой из трех последующих кодировок? Или это должно быть применено к каждому из 3 видеопотоков после сопоставления? BobC 5 лет назад 0
`-vf` - это сокращение от` -filter: v`, поэтому аргумент `-vf` или` -filter: v` будет применяться ко всем выходным видеопотокам. Если вы хотите применить разные выражения наложения к каждому потоку, то вы должны добавить `-filter: v: 0 filters0`` -filter: v: 1 filters1` и `-filter: v: 2 filters2`. В пределах одного выходного файла порядок опций не имеет значения, поэтому карты могут располагаться до или после фильтров или битрейта. Gyan 5 лет назад 0
Также смотрите мой ответ на https://superuser.com/q/1219784/114058 Gyan 5 лет назад 0
Большое спасибо! Я думаю, что часть моей путаницы заключается в том, что я не понимаю, какие опции ffmpeg принимают или не принимают спецификаторы потока. Документация, кажется, избегает упоминания об этом на уровне определения, оставляя меня ломать голову над некомментированными примерами. Есть ли шпаргалка, которую я мог бы использовать? Изменить: BNF для синтаксиса параметров ffmpeg будет хорошо ... BobC 5 лет назад 0
Меня также могут спутать параметры кодека или параметры ffmpeg. Для меня это всего лишь алфавитный суп: контекст и привязка совсем не интуитивны, так что основная синтаксическая диаграмма командной строки ffmpeg была бы очень полезна. BobC 5 лет назад 0
В общем, параметры, связанные с кодеками и фильтрацией, относятся к каждому потоку, а параметры, связанные с форматом, или другие параметры - нет. Исключения, такие как метаданные, связаны с форматом, но могут быть для каждого потока. BNF для фильтров доступен по адресу https://ffmpeg.org/ffmpeg-filters.html#Filtergraph-syntax-1. Gyan 5 лет назад 0
* основная всеохватывающая синтаксическая диаграмма командной строки ffmpeg была бы очень полезна * -> в моем ToDo, но это займет некоторое время. Gyan 5 лет назад 0
Хорошо, вернемся к исходной команде: каков контекст и область действия таких опций libx264, как -preset и -tune? Поскольку они не принимают спецификатор потока, они автоматически применяются ко * всем * применениям libx264? Или просто в каком-то магическом пространстве между «-c [stream_specifier] libx264» и следующим «что угодно», что *** не является *** опцией libx264? Завершает ли появление такой опции обработку параметров libx264? Когда мне нужно повторить -preset, и когда мне не нужно повторять его? BobC 5 лет назад 0
`-preset` и` -tune` являются опциями кодека, даже если они закрытые, и поэтому принимают спецификаторы потока. Gyan 5 лет назад 0
И наоборот, если я опускаю спецификаторы потока в `-preset` и` -tune`, тогда они применяются ко всем применениям `libx264` и, следовательно, должны быть упомянуты ровно один раз в команде` ffmpeg`. Правильно? Где документированы эти мистические вещи? Google не может найти ни одного примера! BobC 5 лет назад 0
Правильно. И смотрите https://ffmpeg.org/ffmpeg.html#AVOptions Gyan 5 лет назад 0
Спецификаторы потока необходимы для *** каждой опции *** в *** каждой строке *** `-b`, иначе все будут закодированы с последними увиденными параметрами. BobC 5 лет назад 0
Да, я скучал по этим. Gyan 5 лет назад 0
Я просто добавил прокрутку текста прокрутки к каждой кодировке, показывая ее разрешение: `-filter: v :? "drawtext = fontfile = / usr / share / fonts / truetype / freefont / FreeSans.ttf \: text = '??? p30? Мбит / с: fontcolor=white@1.0 \: fontsize = 40: y = h-line_h-30 : x = w / 20 * mod (t \, 20) "\` Заменить вопросительные знаки соответствующими значениями для каждой кодировки. BobC 5 лет назад 0

Похожие вопросы