我希望我的网站能够允许用户根据我提供的源视频准确地创建自己的剪辑。
我有一个源视频文件,首先我想将其转换为适合网站的内容:
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
获得良好的结果。
该文件可以在外部播放,没有任何问题 - 但当我将其加载到我的 html5 视频元素中并播放时 - 视频的最后一部分(音频正常)会冻结。最后冻结的部分持续时间不到一秒。
我应该尝试使用其他视频编码器吗? libx264 的最佳替代品是什么?考虑到我可能希望将其放在公共网站上。
但是等一下,它在 MPC 或 Windows Media Player 等播放器上播放时没有出现任何问题,这难道不说明 Google Chrome 或 HTML 视频元素存在问题吗?还是我使用了不受支持的编码?
答案1
的行为-ss
取决于它是用作输入还是输出选项,并且通常较慢,但用作输出选项时可以更准确。请参阅答案ffmpeg缓慢转换指定时间段的视频了解更多详细信息和示例。
要更改输出质量,请source.mp4
使用-crf
值介于 18-28 之间的选项(默认值为 23)。请参阅FFmpeg 和 x264 编码指南举些例子。
您的修剪命令可以简化:
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 源中的工具目录中),或使用该-movflags faststart
选项。这会将一些数据重新定位到文件的开头,以便它可以在完全下载之前开始播放。