ffmpeg是一款视频处理工具了,我们可以在系统中安装之后利用ffmpeg命令进行视频的处理了,下面就一起来看看吧.
剪切/拼接视频文件是一种常见需求,在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗,使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件,能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…
其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务.
剪切代码如下:
- ffmpeg-iinput.mp4-ss**START_TIME**-t**STOP_TIME**-acodeccopy-vcodeccopyoutput.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/joinvideosusingffmpegwithoutqualityloss
- if[-z$1]||[-z$2];then
- echo"Usage:$0c[ut]seconds<File>"
- echo"eg.$0c1080example.mp4"
- echo"eg.$0c00:00:1000:01:20example.mp4"
- echo"Usage:$0j[oin]<FileType>"
- echo"eg.$0javi"
- exit
- fi
- case"$1"in
- c)
- echo"cuttigvideo..."
- fileName=$(echo$4|cut-f1-d'.')
- fileType=$(echo$4|cut-f2-d'.')
- ffmpeg-i$4-ss$2-t$3-acodeccopy-vcodeccopy$fileName-$2-$3.$fileType
- ;;
- j)
- echo"joinningvideos..."
- rmtemp_list.txt
- forfin./*.$2;doecho"file'$f'">>temp_list.txt;done
- printf"file'%s'\n"./*.$2>temp_list.txt
- ffmpeg-fconcat-itemp_list.txt-ccopyoutput.$2
- rmtemp_list.txt//phpfensi.com
- ;;
- *)
- echo"wrongarguments"
- ;;
- esac
- exit
以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本,代码如下:
- #changethistowhatyouneed!!!
- EXTRA_OPTIONS='-vcodeclibx264-crf23-presetmedium-acodecaac-strictexperimental-ac2-ar44100-ab128k'
- ################################################################################
- #
- #NONEEDTOTOUCHANYTHINGAFTERTHISLINE!
- #
- ################################################################################
- #theversionofthescript
- VERSION=1.3
- #locationoftempfolder
- TMP=/tmp
- ################################################################################
- echo"MultiMediaConcatScriptv$VERSION(mmcat)-Ascripttoconcatenatemultiplemultimediafiles."
- echo"BasedonFFmpeg-www.ffmpeg.org"
- echo"Don'tforgettoeditthisscriptandchangeEXTRA_OPTIONS"
- echo""
- ################################################################################
- #syntaxcheck(hastohaveatleast3params:infile1,infile2,outfile
- ################################################################################
- if[-z$3];then
- echo"Syntax:$0<input1><input2><input3>...<output>"
- exit1
- fi
- ################################################################################
- #getallthecommandlineparameters,exceptforthelastone,whichisoutput
- ################################################################################
- #$first-firstparameter
- #$last-lastparameter(outputfile)
- #$inputs-alltheinputs,exceptthefirstinput,because1stinputis
- #handledseparately
- ################################################################################
- first=${@:1:1}
- last=${@:$#:1}
- len=$(($#-2))
- inputs=${@:2:$len}
- #removeallprevioustmpfifos(ifexist)
- rm-f$TMP/mcs_*
- ################################################################################
- #decodefirstinputdifferently,becausethevideoheaderdoesnothavetobe
- #keptforeachvideoinput,onlytheheaderfromthefirstvideoisneeded
- ################################################################################
- mkfifo$TMP/mcs_a1$TMP/mcs_v1
- ffmpeg-y-i$first-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a12>/dev/null</dev/null&
- ffmpeg-y-i$first-an-fyuv4mpegpipe-vcodecrawvideo$TMP/mcs_v12>/dev/null</dev/null&
- #ifyouneedtologtheoutputofdecodingprocesses(usuallynotnecessary)
- #thenreplacethe"2>/dev/null"in2linesabovewithyourlogfilenames,likethis:
- #ffmpeg-y-i$first-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a12>$TMP/log.a.1</dev/null&
- #ffmpeg-y-i$first-an-fyuv4mpegpipe-vcodecrawvideo$TMP/mcs_v12>$TMP/log.v.1</dev/null&
- ################################################################################
- #decodealltheotherinputs,removefirstlineofvideo(header)withtail
- #$all_aand$all_varelistsofalla/vfifos,tobeusedby"cat"lateron
- ################################################################################
- all_a=$TMP/mcs_a1
- all_v=$TMP/mcs_v1
- i=2
- forfin$inputs
- do
- mkfifo$TMP/mcs_a$i$TMP/mcs_v$i
- ffmpeg-y-i$f-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a$i2>/dev/null</dev/null&
- {ffmpeg-y-i$f-an-fyuv4mpegpipe-vcodecrawvideo-2>/dev/null</dev/null|tail-n+2>$TMP/mcs_v$i;}&
- #ifyouneedtologtheoutputofdecodingprocesses(usuallynotnecessary)
- #thenreplacethe"2>/dev/null"in2linesabovewithyourlogfilenames,likethis:
- #ffmpeg-y-i$f-vn-fu16le-acodecpcm_s16le-ac2-ar44100$TMP/mcs_a$i2>$TMP/log.a.$i</dev/null&
- #{ffmpeg-y-i$f-an-fyuv4mpegpipe-vcodecrawvideo-2>$TMP/log.v.$i</dev/null|tail-n+2>$TMP/mcs_v$i;}&
- all_a="$all_a$TMP/mcs_a$i"
- all_v="$all_v$TMP/mcs_v$i"
- leti++
- done
- ################################################################################
- #concatenateallrawaudio/videoinputsintooneaudio/video
- ################################################################################
- mkfifo$TMP/mcs_a_all
- mkfifo$TMP/mcs_v_all
- cat$all_a>$TMP/mcs_a_all&
- cat$all_v>$TMP/mcs_v_all&
- ################################################################################
- #finally,encodetherawconcatenatedaudio/videointosomethinguseful
- ################################################################################
- ffmpeg-fu16le-acodecpcm_s16le-ac2-ar44100-i$TMP/mcs_a_all\
- -fyuv4mpegpipe-vcodecrawvideo-i$TMP/mcs_v_all\
- $EXTRA_OPTIONS\
- $last
- ################################################################################
- #removeallfifos
- ################################################################################
- rm-f$TMP/mcs_*