FFmpeg 是一個(gè)開(kāi)放源代碼的自由軟件,可以運(yùn)行音頻和視頻多種格式的錄影、轉(zhuǎn)換、流功能[1],包含了libavcodec——這是一個(gè)用于多個(gè)項(xiàng)目中音頻和視頻的解碼器庫(kù),以及l(fā)ibavformat——一個(gè)音頻與視頻格式轉(zhuǎn)換庫(kù)。 --Wikipedia
FFmpeg 是一個(gè)處理音頻/視頻非常強(qiáng)大的框架,可以對(duì)音頻/視頻進(jìn)行靈活的操作。
FFmpeg命令的典型語(yǔ)法是:
ffmpeg [全局選項(xiàng)] {[輸入文件選項(xiàng)] -i 輸入_url_地址} ...
{[輸出文件選項(xiàng)] 輸出_url_地址} ...
安裝 FFmpeg 詳見(jiàn) CentOS7 安裝 ffmpeg
ffmpeg -i input.mp4
-i 加上文件的 url 可以查看文件的詳細(xì)信息,其中就包括元數(shù)據(jù)等相關(guān)信息。
ffmpeg -i "two.mp4" -map_metadata -1 -y "input.mp4"
#-map_metadata -1 就是清楚文件的元數(shù)據(jù),-y 表示不用再次詢問(wèn)是否操作
ffmpeg -i input.mp4 -metadata artist=benarchen -metadata title="Test 1" output.mp4
#-metadata artist=benarchen 表示設(shè)置該資源的作者,-metadata title="Test 1" 是設(shè)置標(biāo)題
ffmpeg -i input.mp4 -b:v 3170k -vf "delogo=x=1:y=1:w=1918:h=30:show=0" output.mp4
#-b:v 3170k 是設(shè)置視頻的碼率,可以不加。
#-vf "delogo=x=1:y=1:w=100:h=30:show=0" 表示給視頻添加一個(gè)類似馬賽克的濾鏡效果,濾鏡的大小是以視頻左上角為(1,1)坐標(biāo),寬為 100,高為 30 的濾鏡,如果 show=1 就會(huì)有一個(gè)綠框,我這里是直接設(shè)置不可見(jiàn)
ffmpeg -i input.mp4 -qscale 0 -y output.mp4
#-qscale 0 參數(shù)是為了不影響資源的質(zhì)量
ffmpeg -ss 00:03:00 -i input.mp4 -t 60 -c:v copy -c:a copy output.mp4
#-ss 00:03:00 表示從 3 分鐘開(kāi)始截?。ㄒ簿褪侨コ?3 分鐘的開(kāi)頭)
#-t 60/-to 60 這里 -t 和 -to 都是一樣的效果,意思是從截取開(kāi)始往時(shí)間軸截取 60s
#-c:v copy -c:a copy 意思是復(fù)制源文件的編碼格式,這樣會(huì)比較快
#如果只是去除 3 分鐘的片頭可以不用加 -t 或者 -to 命令,如下:
ffmpeg -ss 00:03:00 -i input.mp4 -c:v copy -c:a copy output.mp4
但是還有一種情況就是在剪掉固定時(shí)長(zhǎng)片頭的同時(shí)也剪掉固定時(shí)長(zhǎng)的片尾,F(xiàn)Fmpeg 官方?jīng)]有直接提供這中功能,一種最常用的思路是在 shell 腳本中先用 FFmpeg -i 把文件的元數(shù)據(jù)信息保留下來(lái),再?gòu)脑獢?shù)據(jù)信息中提取出視頻的時(shí)長(zhǎng),用視頻的總時(shí)長(zhǎng)減去要剪掉的開(kāi)頭時(shí)長(zhǎng)后結(jié)尾時(shí)長(zhǎng)就是我們需要的實(shí)際時(shí)長(zhǎng)了,直接上命令吧
#!/bin/bash
#我這里要切除的開(kāi)頭和結(jié)尾都是 7 秒
beg=7
end=7
#用 for 循環(huán)直接獲取當(dāng)前目錄下的 mp4、mp3、avi 等文件循環(huán)處理,單個(gè)文件可以去掉 for 循環(huán)
for i in (*.mp4,*.mp3,*.avi ); do
#將元數(shù)據(jù)信息臨時(shí)保存到 tmp.log 文件中
nohup /usr/local/ffmpeg/bin/ffmpeg -i "$i" > tmp.log
#獲取視頻的時(shí)長(zhǎng),格式為 00:00:10,10 (時(shí):分:秒,微妙)
time="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk '{print $2}'|awk -F "," '{print $1}'|xargs`"
echo $time
#求視頻的總時(shí)長(zhǎng),先分別求出小時(shí)、分、秒的值,這里不處理微秒,可以忽略
hour="`echo $time |awk -F ":" '{print $1}' `"
min="`echo $time |awk -F ":" '{print $2}' `"
sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
#echo $hour $min $sec
num1=`expr $hour \* 3600`
num2=`expr $min \* 60`
num3=$sec
#計(jì)算出視頻的總時(shí)長(zhǎng)(秒)
sum=`expr $num1 + $num2 + $num3`
#總時(shí)長(zhǎng)減去開(kāi)頭和結(jié)尾就是截取后的視頻時(shí)長(zhǎng),并且這里不需要再轉(zhuǎn)回 hour:min:sec 的格式,直接使用結(jié)果即可
newtime=`expr $sum - $beg - $end`
echo $newtime
/usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t $newtime -c:v copy -c:a copy /data/tmp/$i -y
done
上面的 shell 腳本可以根據(jù)實(shí)際情況作出調(diào)整。
聯(lián)系客服