Как разделять и присоединяться без перекодирования видеофайлов AVC / MPEG-TS в Windows с помощью ffmpeg?

Я также ищу решение для Linux (в отдельном вопросе )

У меня есть два записанных видеофайла с расширением .ts . Мне нужно удалить часть первой, разделить вторую, а затем объединить первый файл с первой (разделенной) частью второго файла.

Оба они имеют одинаковые характеристики:

 Format : MPEG-TS File size : 3.16 GiB Duration : 1h 39mn Overall bit rate mode : Variable Overall bit rate : 4 527 Kbps Video ID : 720 (0x2D0) Menu ID : 6181 (0x1825) Format : AVC Format/Info : Advanced Video Codec Format profile : [email protected] Format settings, CABAC : Yes Format settings, ReFrames : 4 frames Codec ID : 27 Duration : 1h 39mn Width : 1 440 pixels Height : 1 080 pixels Display aspect ratio : 16:9 Frame rate : 25.000 fps Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : MBAFF 

Они также содержат несколько звуковых дорожек и субтитров.

Я хочу обработать их без перекодирования файлов, по крайней мере, удалять начало и т. Д.

FFMPEG :

ffmpeg -i source.mts дает:

 Input #0, mpegts, from 'source1.mts': Duration: 01:40:00.76, start: 2995.511878, bitrate: 4526 kb/s Program 6181 Stream #0:0[0x46](fra,fra): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006) Stream #0:1[0x2d0]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc Stream #0:2[0x2da](fra): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 73 kb/s Stream #0:3[0x2db](qaa): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s Stream #0:4[0x2dc](deu): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 49 kb/s Stream #0:5[0x2dd](qad): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 57 kb/s 

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

 ffmpeg -i InputFile -vcodec copy -acodec copy -ss 00:12:34.567 -t 00:34:56.789 OutputFile 

Работает, за исключением того факта, что вход имеет четыре звуковых дорожки, и таким образом выполняется только первый ( Stream #0:2[0x2da](fra) ) звук. Я хочу: либо все аудио, либо третье ( Stream #0:3[0x2db](qaa) ). Как настроить?

Поэтому ffmpeg должен:

1. Отрежьте начало первого файла (удалите первые 2 минуты из файла 1h40 минут)

2. Разделить второй (1 час) файл на две части (через 3.05 минуты)

3. Присоедините (добавьте) к концу первого файла 3.05-минутную часть, полученную от разделения второго файла.


То, что я пробовал:

Openshot: не может обрабатываться без перекодирования.

Avidemux (Linux): при попытке сохранить это говорит: «Это не совместимо с MPEG – вы не можете использовать Кодек копирования».

Avidemux в Windows: аудио не синхронизировано.

Как разделить и объединить файлы с помощью 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. Я оставлю это для вас, чтобы поэкспериментировать.

В качестве упрощенного ответа на основе основного:

Чтобы сохранить данные после начальной точки (до конца):

 ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT 

Чтобы сохранить данные между двумя точками времени:

 ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT 

Чтобы сохранить данные определенной продолжительности после определенного момента:

 ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT 

Чтобы сохранить данные определенной продолжительности после начала:

 ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT 

Чтобы данные не начинались с момента времени:

 ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT 

TIME может быть числом в секундах или в hh: mm: ss [.xxx]


Чтобы присоединиться к файлам, создайте файл с именем join.txt с контентом

 file 'path-to-INPUT1' file 'path-to-INPUT2' file...etc 

тогда

  ffmpeg -f concat -i join.txt OUTPUT 

Или:

Чтобы присоединиться к файлам mpeg (включая транспортные файлы)

  ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT 

Как решение для графического интерфейса, я попробовал Avidemux, но с плохими результатами. При поиске решения для Linux я нашел этот комментарий здесь, указав на Avidemux ночной :

«Вы можете попробовать Avidemux, но не стабильный. Вы должны попробовать версию win32 (да, для Windows) с« Wine ». Он поддерживает H.264, и вы должны использовать двойную стрелку, чтобы узнать ключевые кадры, потому что вы можете [ Не] повсюду (из-за «длинного гопа» …). Но, как и каждое программное обеспечение, подобное этому, вы можете делать JUST CUTS, в противном случае оно будет отображаться (в случае переходов, эффектов, ectc.). Http: / /avidemux.org/nightly/win32/ "

Я тестировал это в Linux / Wine, но он тоже должен работать в Windows.

Введите описание изображения здесь

Чтобы присоединиться к файлам, используйте File-Open для добавления первого файла, а затем File-Append для остальных.

Для сохранения: Файл – Сохранить.

Давайте будем гением компьютера.