通过 ffmpeg 无损剪切/拼接视频
2016-01-13 10:41
489 查看
http://segmentfault.com/a/1190000000414341
剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗。使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件。能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…
其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务:
剪切:
其中 START_TIME/STOP_TIME 的格式可以写成两种格式:
以秒为单位计数: 80
时:分:秒: 00:01:20
拼接 :
拼接的情况稍微复杂些,我们需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:
相应的命令为:
由于不需要重编码,这两条命令几乎是即时完成的。
方便起见,我写了一个脚本来简化操作。放在 github 上,请自取:
https://gist.github.com/imcaspar/8771268
点击预览
以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本:
https://gist.github.com/imcaspar/8778002
点击预览
ffmpeg
shell
链接
更多
2 推荐
收藏
剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗。使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件。能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…
其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务:
剪切:
ffmpeg -i input.mp4 -ss **START_TIME** -t **STOP_TIME** -acodec copy -vcodec copy output.mp4
其中 START_TIME/STOP_TIME 的格式可以写成两种格式:
以秒为单位计数: 80
时:分:秒: 00:01:20
拼接 :
拼接的情况稍微复杂些,我们需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:
file '/path/to/file1' file '/path/to/file2' file '/path/to/file3'
相应的命令为:
ffmpeg -f concat -i **list.txt** -c copy output.mp4
由于不需要重编码,这两条命令几乎是即时完成的。
方便起见,我写了一个脚本来简化操作。放在 github 上,请自取:
https://gist.github.com/imcaspar/8771268
点击预览
#!/bin/bash #cut/join videos using ffmpeg without quality loss if [ -z $1 ] || [ -z $2 ]; then echo "Usage:$0 c[ut] seconds <File>" echo " eg. $0 c 10 80 example.mp4" echo " eg. $0 c 00:00:10 00:01:20 example.mp4" echo "Usage:$0 j[oin] <FileType>" echo " eg. $0 j avi" exit fi case "$1" in c) echo "cuttig video..." fileName=$(echo $4 | cut -f 1 -d '.') fileType=$(echo $4 | cut -f 2 -d '.') ffmpeg -i $4 -ss $2 -t $3 -acodec copy -vcodec copy $fileName-$2-$3.$fileType ;; j) echo "joinning videos..." rm temp_list.txt for f in ./*.$2; do echo "file '$f'" >> temp_list.txt; done printf "file '%s'\n" ./*.$2 > temp_list.txt ffmpeg -f concat -i temp_list.txt -c copy output.$2 rm temp_list.txt ;; *) echo "wrong arguments" ;; esac exit
以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本:
https://gist.github.com/imcaspar/8778002
点击预览
ffmpeg
shell
链接
更多
2 推荐
收藏
你可能感兴趣的文章
相关文章推荐
- 关于初学者上传文件到github的方法
- 在TextView里面显示log
- 个人创业楷模:一个人,一个网站,5.75亿美元卖掉
- 借助JRebel使Tomcat支持热部署
- 输入法不见了
- 《人工智能学家》启动2016世界人工智能智商测试,原理和方法
- 将秒数转化为时分秒
- Linux基础命令学习之旅“date”篇
- Linux从一台linux服务器传文件到另一台linux服务器-适合断点续传(备份)
- Linux从一台linux服务器传文件到另一台linux服务器-适合断点续传(备份)
- KNN算法对新上市汽车评估分析
- 重复记录的处理
- ios UITextView 插入图片和文字自适应高度
- [leetcode] 15. 3Sum
- Android手机怎样导出数据库文件
- 1.5线程优先级
- 全球化视野与创新
- JS中alert中文乱码
- JEasyframe使用教程2 项目结构
- [提醒]曾经犯的谜之错误