给大家带来linux中利用ffmpeg 无损剪切/拼接视频程序
如果你学不好的话,你在linux中开发的机会就很少,或者说几乎没有,它的优势就消失了,然后随着时间的流逝,你就会全部忘记她;剪切/拼接视频文件是一种罕见需求。在线视频网站如今常常将一个视频文件支解成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-fconcat-i**list.txt**-ccopyoutput.mp4 因为不必要重编码,这两条命令几近是立即完成的。
便利起见,我写了一个剧本来简化操纵。放在github上,请自取:
代码以下#!/bin/bash
#cut/joinvideosusingffmpegwithoutqualityloss
if[-z$1]||[-z$2];then
echo"Usage:$0cseconds<File>"
echo"eg.$0c1080example.mp4"
echo"eg.$0c00:00:1000:01:20example.mp4"
echo"Usage:$0j<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
;;
*)
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"DontforgettoeditthisscriptandchangeEXTRA_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_*
</p>
常用的linux命令,尤其是一些能帮你提高开发效率的命令,(eg:grep,awk,sed,split等); 生成新的unispimsp.ksc。”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的。 通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。 其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。 写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。 请问谁有Linux的学习心得的吗?简单的说说? 主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。 放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。
页:
[1]