腾讯视频/爱奇艺/优酷/外卖 充值4折起
剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 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 上,请自取:
代码如下 | |
#!/bin/bash #cut/join videos using ffmpeg without quality loss if [ -z $1 ] || [ -z $2 ]; then case "$1" in |
以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本
代码如下 | |
# change this to what you need !!! extra_options='-vcodec libx264 -crf 23 -preset medium -acodec aac -strict experimental -ac 2 -ar 44100 -ab 128k' ################################################################################ # the version of the script # location of temp folder ################################################################################ echo "multimedia concat script v$version (mmcat) - a script to concatenate multiple multimedia files." ################################################################################ ################################################################################ # remove all previous tmp fifos (if exist) ################################################################################ ffmpeg -y -i $first -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $tmp/mcs_a1 2>/dev/null ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $tmp/mcs_v1 2>/dev/null # if you need to log the output of decoding processes (usually not necessary) ################################################################################ ffmpeg -y -i $f -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $tmp/mcs_a$i 2>/dev/null { ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>/dev/null $tmp/mcs_v$i ; } & # if you need to log the output of decoding processes (usually not necessary) all_a="$all_a $tmp/mcs_a$i" ################################################################################ ################################################################################ ################################################################################ |