1

У меня есть список файлов TS, которые будут объединены для последующей обрезки и закодировать его в mp4.

Все работает нормально ... однако проблема, с которой я сталкиваюсь сейчас, заключается в том, что файл перекодирован ... и это не то, что я хочу, так как ts уже h264 и mp3, так что просто упаковать его в mp4 работает Хорошо. На самом деле, это работает:

ffmpeg -i file.ts -c copy file.mp4

Но это не так

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

Очевидно, что он не будет "копировать" кодеки, потому что выходные данные поступают из виртуального выхода, который отображается на [out] (или что-то в этом роде ... честно говоря, я не знаю точно, как это работает, но я знаю, что это так) так что у него нет "кодека", скажем так ... поэтому он не может скопировать его.

Это означает, что у меня есть 2 проблемы:

  1. Файл меньше, что совсем неплохо, но ...
  2. Файл перекодируется ... так что качество тоже меньше.

Как я могу избежать этого, чтобы сохранить качество видео?

1 ответ1

2

Фильтрация требует перекодирования, но у вас есть другая опция:

1. Сделайте каждый сегмент

Вместо этого вы можете выполнить потоковое копирование каждого сегмента, используя -ss и -t или -to с -c copy .

  • Пример, чтобы пропустить первые 10 секунд и сделать 20 секунд вывода:

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • Пример, чтобы пропустить первые 10 секунд и остановиться на продолжительности 30, что приведет к 20-секундному выводу:

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2. Объединить

  1. Сначала прочитайте документацию concat demuxer.

  2. Затем создайте файл списка:

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. Наконец, вы можете объединить:

    ffmpeg -f concat -i inputs.txt -c copy output
    

Также см

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