Как разделить и объединить файлы ffmpeg
, сохранив при этом все звуковые дорожки?
Как вы обнаружили, битовая копия выберет только одну (аудио) дорожку в соответствии с документацией спецификации потока :
По умолчанию
ffmpeg
включает только один поток каждого типа (видео, аудио, субтитры), присутствующий во входных файлах, и добавляет их в каждый выходной файл. Он выбирает «лучший» из каждого на основе следующих критериев: для видео это поток с самым высоким разрешением, для аудио это поток с наибольшим количеством каналов, для субтитров это первый поток субтитров. В случае, когда несколько потоков одинакового типа имеют одинаковую скорость, выбирается поток с наименьшим индексом.
Чтобы выбрать все звуковые дорожки:
ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts
Чтобы выбрать третью звуковую дорожку:
ffmpeg -i InputFile.ts -c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a:2 FirstFile.ts
Вы можете прочитать больше о и посмотреть другие примеры выбора потока в расширенных опциях раздела ffmpeg
документации.
Я бы также соединил -vcodec copy -acodec copy
из вашей оригинальной команды в -c copy
вышеописанное для компактности выражения.
Трещина:
Итак, объединяя их с тем, чего вы хотите достичь в двух файлах с точки зрения разделения для последующего повторного объединения:
ffmpeg -i InputOne.ts -ss 00:02:00.0 -c copy -map 0:v -map 0:a OutputOne.ts ffmpeg -i InputTwo.ts -c copy -t 00:03:05.0 -map 0:v -map 0:a OutputTwo.ts
дам тебе:
OutputOne.ts
, что все после первых двух минут первого входного файлаOutputTwo.ts
, который является первыми 3 минутами и 5 секундами второго входного файла
Присоединиться:
ffmpeg
поддерживает конкатенацию файлов без перекодирования, подробно описанную в документации по конкатенации .
Создайте свой список файлов для присоединения (например join.txt
):
file '/path/to/files/OutputOne.ts' file '/path/to/files/OutputTwo.ts'
Тогда ваша ffmpeg
команда может использовать concat demuxer
:
ffmpeg -f concat -i join.txt -c copy FinalOutput.ts
Поскольку вы работаете с mpeg
транспортными потоками ( .ts
), вы также должны иметь возможность использовать протокол concat :
ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4
В соответствии с примером на странице concat, указанной выше. Я оставлю это на ваше усмотрение, чтобы поэкспериментировать.