使用ffmpeg准确切割视频(+音频)


10

我希望我的网站允许用户根据我提供的源视频准确地创建自己的剪辑。

我有一个源视频文件,我首先要转换为适合网站的内容:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

我用ffmpeg像这样转换它:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

观看此视频可以满足我的需求,质量足够好,文件大小也足够小,并且可以在我的网站上加载/播放。

我有一个网页,允许用户选择该视频的开始和终点-并创建剪辑。这是我使用的ffmpeg命令的示例:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

问题是剪辑并不总是足够精确。通常,音频足够准确,但是视频会提前半秒钟停止播放。

有什么方法可以使这种精确和同步的速度达到0.2秒吗?

编辑:添加-force_key_frames 00:00:00.2没有帮助。

编辑:我更改使用剪辑,-c:v libx264 -c:a aac -strict experimental而不是-codec:v copy -codec:a copy具有良好(ish)结果。

该文件可以在外部播放而没有问题-但是,当我将其加载到html5视频元素中并播放时-视频的最后一部分(音频很好)会冻结。冻结的最后一部分不到一秒钟。

我应该与其他视频编码器一起尝试吗?libx264的最佳替代方法是什么?请记住,我可能希望将其放置在公共网站上。

但是,坚持不下去,就不能正确播放MPC或Windows Media Player之类的播放器这一事实,是否暗示Google Chrome或HTML video元素有问题?还是我使用的是不受支持的编码?


这可能与关键帧的时间有关。无论如何,都应将其移至SuperUser.com。
Brad 2012年

嗨,ffmpeg无法在任何时候剪切视频,只能在关键帧上剪切;因此,音频几乎是精确的,而视频却不是。

我可以自己移动吗?我将尝试使用-force_key_frames 00:00:00.2将关键帧添加到源文件中
Pete Oakey

Answers:


9

-ss更改行为取决于它用作输入或输出选项,并且通常较慢,但用作输出选项时可能更准确。有关更多详细信息和示例,请参见ffmpeg缓慢转换指定时间段内的视频的答案。

要更改输出质量以source.mp4使用-crf18-28之间的值(默认值为23)。有关示例,请参见FFmpeg和x264编码指南的CRF部分。

您的修整命令可以简化:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

我换成-codec:v copy -codec:a copy-c copy -map 0。这将复制所有流,而不是仅复制第一个视频和音频流-尽管由于您先前的命令输入只有两个流。由于您无法缩放而不重新编码,因此与会互斥-codec:v copy,并且由于您的输入已经缩放至设置的大小,因此我删除了过滤器选项。

如果仍然不够准确,请尝试:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

它将较慢,但可能更准确。有关这两个示例的区别的说明,请参见我提供的第一个链接中答案中的链接。

最后,你应该运行source.mp4通过qt-faststart(位于ffmpeg的源tools目录),或使用-movflags faststart选项。这会将一些数据重定位到文件的开头,以便可以在完全下载文件之前开始播放。


+1提示,但我尝试了ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c复制-map 0 clip1.mp4,但是第一部分(几乎是第二秒)和最后一部分(可能是四分之一秒)错过了视频,但是音频很好。
皮特·奥凯

@PeteOakey您是否尝试过在没有比特流复制的情况下进行剪切,但是实际重新编码了吗?
slhck

在没有比特流复制的情况下进行了尝试-结果附加到我的问题中。
皮特·奥凯

3
使用-ss输出选项而不是输入选项解决了我的问题:输出视频中的第一个视频帧约为1s,在此之前只有音频(也由确认ffprobe -show_frames)。移动-ss之后-i使其输出音频和视频帧开始于帧0
CodeManX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.