1

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

#!/bin/bash

ffmpeg -y -i video1.mkv  -c:v libx264 -pass 1  -preset slower -b:v 10000k -x264opts frameref=8:fast_pskip=0 -f rawvideo temp_1.mkv

ffmpeg -i temp_1.mkv -i audio1.dts -c:a dts -b:a 1500k -ar 48000 -c:v libx264 -pass 2 -preset slow -b:v 10000k -strict -2 -x264opts fram
eref=10:fast_pskip=0 part1_final.mkv

ffmpeg -y -i video2.mkv  -c:v libx264 -pass 1  -preset slower -b:v 10000k -x264opts frameref=8:fast_pskip=0 -f rawvideo temp_2.mkv

ffmpeg -i temp_2.mkv -i audio2.dts -c:a dts -b:a 1500k -ar 48000 -c:v libx264 -pass 2 -preset slow -b:v 10000k -strict -2 -x264opts fram
eref=10:fast_pskip=0 part2_final.mkv

ffmpeg -ss 00:00:00 -t 01:46:39 -i part1_final.mkv -vcodec copy -acodec copy  part1_trimmed.mkv

ffmpeg -f concat -i input.txt -codec copy FINAL.mkv

video1.mkv и video2.mkv извлекаются из Blu-ray и обрабатываются через eac3to, чтобы быть только видеодорожкой. Audio1.dts и audio2.dts также являются соответствующими звуковыми дорожками. Мне нужно обрезать первый финализированный диск, потому что там около 6 секунд черного экрана, который я просто не хочу в финальном видео. Вот мой input.txt:

file './part1_trimmed.mkv'
file './part2_final.mkv'

Вот результаты ffprobe из part1_trimmed.mkv, part2_final.mkv и FINAL.mkv:

Input #0, matroska,webm, from 'part1_trimmed.mkv':
  Metadata:
    ENCODER         : Lavf56.16.101
  Duration: 01:46:39.27, start: 0.083000, bitrate: 11543 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Metadata:
      ENCODER         : Lavc56.16.100 libx264
    Stream #0:1: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)
    Metadata:
      ENCODER         : Lavc56.16.100 dca

Input #0, matroska,webm, from 'part2_final.mkv':
  Metadata:
    ENCODER         : Lavf56.16.101
  Duration: 02:08:52.02, start: 0.083000, bitrate: 11545 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Metadata:
      ENCODER         : Lavc56.16.100 libx264
    Stream #0:1: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)
    Metadata:
      ENCODER         : Lavc56.16.100 dca

Input #0, matroska,webm, from 'FINAL.mkv':
  Metadata:
    ENCODER         : Lavf56.16.101
  Duration: 03:55:31.29, start: 0.083000, bitrate: 11544 kb/s
    Stream #0:0: Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)

Наконец, если это поможет, вот как выглядит видео во второй части FINAL.mkv:

1 ответ1

1

Один из способов объединить 2 фильма с "отрубанием" одного фильма - это использовать фильтры trim и concatenate в цепочке. Сначала настройте обрезку пленки для нарезки, а затем сделайте обрезанную версию доступной для объединенного фильтра для присоединения.

По существу Film1 -> trim -> trimmed_version; [trimmed_version] + [film2] -> concatenate -> output .
С аудио и видео 2 потока требуют своих собственных цепочек. Таким образом, для обрезки film1.mkv и присоединения к film2.mkv в двухпроходном формате это будет схема:

ffmpeg -i film1.mkv -i film2.mkv -y -filter_complex '[0:a]atrim=duration=6399, asetpts=PTS-STARTPTS[at]; [0:v] trim=duration=6399, setpts=PTS-STARTPTS[vt]; [vt] [at] [1:v] [1:a] concat=n=2:v=1:a=1[v] [a]' -map '[v]' -map '[a]' -pass 1 [other_encoding_parameters] -f mp4 /dev/null

ffmpeg -i film1.mov -i film2.mov -y -filter_complex '[0:a]atrim=duration=6399, asetpts=PTS-STARTPTS[at]; [0:v] trim=duration=6399, setpts=PTS-STARTPTS[vt]; [vt] [at] [1:v] [1:a] concat=n=2:v=1:a=1[v] [a]' -map '[v]' -map '[a]' -pass 2 [other_encoding_parameters] FINAL.mkv

asetpts и setpts сбрасывают начальную метку времени обрезанных видео на ноль, даже если в этом конкретном случае обрезается только конец.

Примечание 1: будет перекодировка. Я не указал параметры кодирования. Вы должны будете добавить свой собственный согласно вашим требованиям.
Примечание 2: trim и длительности atrim фильтров.Сильна должны быть указаны в секундах.

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