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

11921
cipricus

Я также ищу решение для 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 : High@L4 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 минуты из файла продолжительностью 1 ч 40 мин)

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

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


Что я пробовал:

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

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

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

3
Я думаю, что ваше желание обновить вопрос - хорошая идея - комментарии не предназначены для расширенного обсуждения :) Я или кто-то еще могу ответить на ваши вопросы более четко! bertieb 8 лет назад 0
Хорошая работа, но я не проголосовал и не имею привилегий VTC; поэтому я не могу обратиться к тем, кто сделал это. bertieb 8 лет назад 0
Все, что я хотел бы добавить, это то, что, учитывая изменение объема вопроса, я бы с осторожностью оставил вопрос unix.SE открытым, так как это можно рассматривать как перекрестную публикацию, которая осуждается. Вам решать, нужно ли обоим оставаться открытыми, и я сам не делаю никакого суждения, но я подозреваю, что другие могут рассматривать это как таковое. bertieb 8 лет назад 0
@bertieb - Несмотря на то, что могут быть предоставлены общие ответы, мой вопрос U & L теперь является другим, поскольку он требует общего решения для Linux, в то время как этот вопрос требует решения FFMPEG в Windows. - Я действительно создал ответ для Linux на основе вашего ответа здесь и разместил здесь упрощенную версию вашего ответа, добавив также возможное решение с графическим интерфейсом. cipricus 8 лет назад 0

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

5
bertieb

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

Я забыл включить видео `-map`ping, спасибо за напоминание. Я обновил вопрос о том, как объединять (объединять) видеофайлы вместе согласно вашему редактированию. bertieb 8 лет назад 0
Мое редактирование включает в себя раздел о присоединении файлов. Я все еще не уверен, что вы подразумеваете под «раскол», но я рад, что у вас есть команда, которая работает :) bertieb 8 лет назад 0
Сколько выходов вы хотите? Один, последний присоединенный файл? Или вам нужны * обе * части раскола во втором файле? bertieb 8 лет назад 0
Чтобы сохранить * все * потоки (видео, аудио, субтитры), замените все `-map`s на единственный:` -map 0` bertieb 8 лет назад 1
отредактируйте содержимое `join.txt`: путь к файлам должен быть в обратном порядке, чтобы работать. но ни одно из решений для объединения не позволяет сохранить все аудио, так как выбран только default / first cipricus 8 лет назад 0
Хороший улов, я могу поклясться, что они были в предыдущей редакции. Относительные пути также будут работать. bertieb 8 лет назад 0
Есть ли способ объединить файлы со всеми аудио? они теряются за исключением одного по умолчанию при присоединении. или я выберу на предыдущем этапе предпочтительный и использую его в обоих файлах для объединения cipricus 8 лет назад 0
Если `concat`demuxer * также * только захватывает 'лучший' трек (ожидал, что он будет работать по-другому, но тогда это` ffmpeg` ...), я бы включил в этот шаг `-map 0` , bertieb 8 лет назад 1
интересно, комментарий под [здесь] (http://askubuntu.com/a/370190/47206) о том, что `-ss` должен использоваться перед` -i`, а `-t` должен быть после` -i`. Также: http://trac.ffmpeg.org/wiki/Seeking и http://askubuntu.com/a/547995/47206 cipricus 8 лет назад 0
Расположение команд `ffmpeg` очень важно. `-ss` может использоваться до или после` -i` для немного разных методов достижения одного и того же (поиск с точностью до кадра). Вы также можете использовать `-to`, если вы предпочитаете указывать время окончания, а не продолжительность (` -t`). bertieb 8 лет назад 1
замена `ffmpeg` на` avconv` работает нормально, я думаю, в Linux. Это также доступно для Windows? cipricus 8 лет назад 0
`ffmpeg` доступен для систем Windows через [Zeranoe] (http://ffmpeg.zeranoe.com/builds/), да. Я бы предпочел не связываться с `ffmpeg` против` avconv`, но посмотреть http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even -a-разность и http://stackoverflow.com/questions/9477115/what-are-the-differences-and-similities-between-ffmpeg-libav-and-avconv/9477756#9477756 bertieb 8 лет назад 1
После «Чтобы выбрать все звуковые дорожки:» измените команду, добавив пробел после `InputFile.ts` cipricus 8 лет назад 0
1
cipricus

As a simplified answer based on the main one:

To keep data after a start point (up to the end):

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

To keep data between two time points:

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

To keep data of a certain duration after a certain point:

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

To keep data of a certain duration after beginning:

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

To keep data from beginning up to a time point:

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

TIME may be a number in seconds, or in hh:mm:ss[.xxx]


To join files, create a file called join.txt with the content

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

then

 ffmpeg -f concat -i join.txt OUTPUT 

Or:

To join mpeg files (including transport files)

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

As a GUI solution, I have tried Avidemux but with bad results. When searching a Linux solution I have found this comment here pointing to Avidemux nightly:

"You can try Avidemux, but not the stable one. You should try the win32 version (yes, for windows) with "Wine". It supports H.264 and you must use the double arrow to find out the keyframes because you can[not] cut everywhere (due to the "long gop" thing...). But, as every software like this, you can do JUST CUTS otherwise it will render (in case of transitions, effects, ectc.). http://avidemux.org/nightly/win32/"

I have tested that in Linux/Wine but it should work in Windows too.

enter image description here

To join files, use File-Open to add first file, and then File-Append for the rest.

To save: File - Save.