3

Я также ищу решение для 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: звук не синхронизирован.

2 ответа2

4

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

2

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

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

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

ВРЕМЯ может быть числом в секундах или чч: мм: сс [.ххх]


Чтобы объединить файлы, создайте файл с именем 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, иначе оно будет отображаться (в случае переходов, эффектов и т.д.). http://avidemux.org/nightly/win32/ "

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

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

Сохранить: Файл - Сохранить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .