将电影的两部分合并在一起会导致第二部分没有视频

将电影的两部分合并在一起会导致第二部分没有视频

我正在尝试对我收藏的一系列电影进行编码,每部电影都放在两个磁盘上。我编写了一个基本的脚本,可以很好地处理第一部电影。但是,对于第二部和第三部电影,由于某种原因,最终的输出文件存在问题,整部电影的后半部分似乎缺少视频流。这是我的脚本:

#!/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 是从蓝光光盘中截取的,并通过 eac3to 处理为视频轨道。Audio1.dts 和 audio2.dts 同样只是各自的音轨。我必须修剪第一个最终完成的磁盘,因为最终视频中有大约 6 秒的黑屏,我不想要它。这是我的 input.txt:

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

以下是 part1_trimmed.mkv、part2_final.mkv 和 FINAL.mkv 的 ffprobe 结果:

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

将两部影片合并在一起并从一部影片中“截取”的一种方法是在链中使用trimconcatenate过滤器。首先设置修剪要截取的影片,然后将修剪后的版本提供给连接过滤器进行合并。

本质 上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:和过滤trimatrim的持续时间必须以秒为单位指定。

相关内容