FFMPEG:

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                           : 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. Вы не можете использовать кодек Copy».

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

решение1

Как разделить и объединить файлы, 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), выдолжениметь возможность использовать конкатпротоколтакже:

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

ВРЕМЯ может быть числом в секундах или в формате чч:мм:сс[.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

В качестве решения GUI я пробовал Avidemux, но с плохими результатами. При поиске решения Linux я нашел этот комментарийздесьуказывает наAvidemux еженощно:

«Вы можете попробовать Avidemux, но не стабильную версию. Вам следует попробовать версию win32 (да, для Windows) с «Wine». Она поддерживает H.264, и вам нужно использовать двойную стрелку, чтобы узнать ключевые кадры, потому что вы не можете вырезать везде (из-за «длинного гопа»…). Но, как и в любом программном обеспечении, вы можете делать ТОЛЬКО ВЫРЕЗКИ, иначе будет рендеринг (в случае переходов, эффектов и т. д.). http://avidemux.org/nightly/win32/"

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

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

Чтобы объединить файлы, используйтеФайл-Открытьдобавить первый файл, а затемФайл-Добавитьдля остальных.

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

Связанный контент