linux中使用ffmpeg 无损剪切/拼接视频程序
时间:2023-06-02 16:16:41 来源: 人气:
剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗。使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件。能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…, 其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务:, 剪切:, 其中 START_TIME/STOP_TIME 的格式可以写成两种格式:, 以秒为单位计数: 80, 时:分:秒: 00:01:20, 拼接 :, 拼接的情况稍微复杂些,我们需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:, 相应的命令为:, 由于不需要重编码,这两条命令几乎是即时完成的。, 方便起见,我写了一个脚本来简化操作。放在 github 上,请自取:,#!/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, 以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本,# change this to what you need !!! EXTRA_OPTIONS=-vcodec libx264 -crf 23 -preset medium -acodec aac -strict experimental -ac 2 -ar 44100 -ab 128k ################################################################################ # # NO NEED TO TOUCH ANYTHING AFTER THIS LINE! # ################################################################################ # the version of the script VERSION=1.3 # location of temp folder TMP=/tmp ################################################################################ echo "MultiMedia Concat Script v$VERSION (mmcat) - A script to concatenate multiple multimedia files." echo "Based on FFmpeg - www.ffmpeg.org" echo "Dont forget to edit this script and change EXTRA_OPTIONS" echo "" ################################################################################ # syntax check (has to have at least 3 params: infile1, infile2, outfile ################################################################################ if [ -z $3 ]; then echo "Syntax: $0 ...