我想将一个长达 50 分钟的视频文件分割成两个 25 分钟的部分。我终于找到了如何通过命令行将一个视频文件传输到另一个视频文件中,这要归功于http://www.videolan.org/doc/streaming-howto/en/ch03.html和http://www.videolan.org/doc/streaming-howto/en/ch04.html文档。
下面是我用来实现此目的的终端命令:
vlc original_video.mp4 --start-time 0 --stop-time 1500 --sout "#standard{access=file,mux=ts,dst=/home/max/Desktop/video_A.mp4}"
唯一的问题是,VLC 似乎只是坐在那里将视频流式传输original_video.mp4
到video-A.mp4
。我在 5 分钟后停止了它,发现它video_A.mp4
只有 5 分钟长。
有没有什么办法可以加快这一进程?
答案1
我会ffmpeg
用段复用器(向下滚动该链接可查看一些示例)。基本上:
ffmpeg -i input.mp4 -c copy -f segment -segment_times 1500 output%02d.mp4
这将生成两个文件“output01.mp4”和“output02.mp4”。如果您使用output%03d.mp4
,则会得到“output001.mp4”和“output002.mp4”。
-segment_times
要求以逗号分隔的分割点列表,以秒为单位。由于您只想分割一次,即 25 分钟,因此只需使用 1500 (=25*60)。请注意,-segment_time
(没有“s”)是一个完全独立的选项 - 如果您想每五秒分割一次文件(例如),而不是输入每个特定时间的大列表,则可以使用它。
您可能会发现需要使用-reset_timestamps 1
以下命令才能正确播放文件:
ffmpeg -i input.mp4 -c copy -f segment -segment_times 1500 -reset_timestamps 1 output%02d.mp4
文档页面上还有更多选项。这应该非常快,而且无损(因此您将获得相同的视频,没有额外的视频伪影)。但是,它不会 100% 准确,因为 ffmpeg 需要在一个关键帧,如果不重新编码就无法保证这一点。
如果您需要精确的拆分,文档建议重新编码并使用-force_key_frames
和-segment_time_delta
选项以确保I 帧关于段复用器尝试拆分的时间(另请参阅库文件和加气混凝土编码指南ffmpeg 维基):
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset veryfast -c:a libfdk_aac -vbr 3 \
-force_key_frames 1500 -f segment -segment_times 1500 -segment_time_delta 0.05 output%02d.mp4
大多数 Linux 存储库中的 ffmpeg 版本相当旧,而 Debian 和 Ubuntu 等系统的情况更糟:它们不提供 ffmpeg,而是提供 fork,avconv,来自 libav 团队(也可以看看LordNeckbeard 的回答在这里)。AVconv 本身就是一个很好的工具,但我不能保证 ffmpeg 语法能够 100% 地与它兼容,尤其是像这样的“高级”东西。
我会推荐从 ffmpeg 下载页面获取静态构建或者自己编译。自己编译的主要好处是,您可以访问libfdk_aac
ffmpeg 可以使用的最佳 AAC 音频编码器 - 由于许可冲突(fdk_aac 使用自定义的 copyleft 许可证,与 ffmpeg 的 GPL 不太兼容),它不能在编译的 ffmpeg 二进制文件中合法分发。