我有一个文件
其他 - Analogue Clock-JEJqy1Wlovw.mp4 只需从以下网址下载即可https://www.youtube.com/watch?v=JEJqy1Wlovw
时长为2分13秒。
我在将其剪切到第二个时遇到了一些问题。
我能够使用这个命令
ffmpeg -ss 0 -i infile.mp4 -c copy -t 60 output.mp4
制作一个 60 秒的文件,所以到目前为止没有问题。
该文件正好是 1 分钟,到目前为止没有问题。
C:\vids\a>dir
blahhclo.mp4 9,590,540 bytes
C:\vids\a>
C:\vids\a>mediainfo blahhclo.mp4
General
Complete name : blahhclo.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom
File size : 9.15 MiB
Duration : 1mn 0s
Overall bit rate : 1 278 Kbps
Writing application : Lavf58.3.100
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 3 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 1mn 0s
Bit rate : 1 146 Kbps
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.022
Stream size : 8.21 MiB (90%)
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 1mn 0s
Bit rate mode : Constant
Bit rate : 126 Kbps
Channel count : 2 channels
Channel positions : Front: L R
Sampling rate : 44.1 KHz
Compression mode : Lossy
Delay relative to video : 40ms
Stream size : 920 KiB (10%)
C:\vids\a>
但是当我尝试在以下时间剪切时,我确实遇到了一个问题,那就是我是否尝试剪切 1 分钟的片段还是整个 2 分 13 秒的片段。
如果我使用 -ss 0 -t 1 剪切,它会生成一个 1s 22ms 的文件。
所以这还不算太糟,已经相当接近一秒了。对于缩短一秒的尝试来说,1.022 秒已经相当不错了。
如果我使用 -ss 0 -t 2 剪切,它会生成一个 3 秒 19 毫秒的文件,这太糟糕了!它应该是一秒钟!
如果我使用 -ss 0 -t 30 进行剪切,那么就可以了,它会执行 30 秒 1 毫秒。
或者例如这个视频,也是 mp4https://www.youtube.com/watch?v=pJ3-xf26wDE
C:\blah>ffmpeg -ss 189 -i vid.mp4 -c copy -t 6 someoutput.mp4
C:\blah>mediainfo someoutput.mp4
持续时间为 8 秒 383 毫秒
但这是错误的,因为它应该是 6 秒!所以这多出了两秒!
C:\blah>ffmpeg -ss 191 -i vid.mp4 -c copy -t 6 someoutput2.mp4
C:\blah>mediainfo output2.mp4
显示 ffmpeg 产生了持续时间为 10s 403ms 的视频
这是非常错误的,因为 ffmpeg 命令指定了 6 秒!
所以这不只是迟了 1 秒,而是迟了 4 秒!
这几乎比实际时间长了 50%!
答案1
如果你需要帧精度,不要使用-c copy
,它的含义与 相同-c:a copy -c:v copy -c:s copy
。它会复制比特流,如果指定的开始或结束时间不在I 帧,则获取最近的一个,但该位置可能与所需位置相距很远。另请参阅寻求维基。
但是,您可以重新编码视频以获得准确的剪切。音频可以复制,因为基本上,音频流只有“关键帧”。例如,为了将视频编码为 H.264 并复制音频,请应用以下命令:
ffmpeg -ss 191 -i vid.mp4 -c:v libx264 -c:a copy -t 6 someoutput3.mp4
成功了;它生成的文件耗时为 6 秒 26 毫秒。因此,这与使用比特流复制的耗时(10.4 秒)相比非常接近。
重新编码可能会降低视频流的质量。要更改视频质量,请参阅H.264 编码指南。
此命令:
ffmpeg -ss 193 -i vid.mp4 -c:v libx264 -c:a copy -t 4 someoutput4.mp4
生成一个耗时 4 秒 26 毫秒的文件。接近 4 秒,这是应该的,而如果我使用比特流复制,则需要 5 秒多一点。