寫一個(gè)shell腳本實(shí)現(xiàn)視頻處理
需求
去年同事準(zhǔn)備做個(gè)公司內(nèi)部的大講堂網(wǎng)站,將一些內(nèi)部培訓(xùn)的視頻匯總,提供給公司同事觀看,網(wǎng)站搭建相對來說比較簡單,直接用Ant.design Pro+Eggjs實(shí)現(xiàn)。但是為了體驗(yàn)更好一些,我們準(zhǔn)備將視頻,根據(jù)內(nèi)容進(jìn)行切割,方便用戶快速找到自己感興趣的內(nèi)容,同時(shí)轉(zhuǎn)成m3u8上傳cdn,優(yōu)化視頻播放和緩沖的速度。
這就涉及到了視頻切割和格式轉(zhuǎn)換,傳統(tǒng)的做法是通過視頻剪輯軟件來處理即可,但是作為開發(fā),還是想用一些自動(dòng)化的方法來完成這個(gè)工作,畢竟時(shí)間最寶貴了??,因此就想到了直接使用shell腳本一鍵完成切割、轉(zhuǎn)換和上傳。
第一次寫shell腳本,也是邊學(xué)邊寫,所以肯定還有很多可以優(yōu)化的地方,和大家一起學(xué)習(xí)啊...??
視頻處理 ffmpeg
想要用shell處理視頻,首先要有處理視頻的命令行工具,這個(gè)不難找,百度一下就發(fā)現(xiàn)了ffmpeg,一個(gè)神級視頻處理庫。
FFmpeg 是視頻處理最常用的開源軟件。FFmpeg 本身是一個(gè)龐大的項(xiàng)目,包含許多組件和庫文件,最常用的是它的命令行工具。本文介紹 FFmpeg 命令行如何處理視頻,比桌面視頻處理軟件更簡潔高效。[借用一下阮一峰老師對ffmpeg的介紹]
關(guān)于ffmpeg以及視頻編解碼的介紹,可以去阮老師這邊看。
我們的需求是裁剪和格式轉(zhuǎn)換,這里也針對性介紹一下這兩個(gè)場景的命令。
裁剪
# 起始時(shí)間+時(shí)長 ffmpeg -ss [start] -i [input] -t [duration] -c copy [output] # 起始時(shí)間+結(jié)束時(shí)間 ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
- -ss:裁剪的開始時(shí)間
- -i:輸入文件
- -to:裁剪的截止時(shí)間
- -t:時(shí)間長度
- -c copy:直接復(fù)制,不經(jīng)過重新編碼
格式轉(zhuǎn)換
ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
- -profile:v baseline:輸出編碼指定具體的H.264標(biāo)準(zhǔn)。
- -level:--
- -start_number:--
- -hls_time:每個(gè)切片的時(shí)間
- -hls_list_size:設(shè)置播放列表保存的最多條目,設(shè)置為0會保存有所片信息
- -f:指定視頻容器
配置參數(shù)
sed命令
為了后面方便處理不同的視頻,我希望將一些配置參數(shù)提取出來,配置文件config
如下:
File=source.mp4 # 待處理文件地址 Cut_config=videos.csv # 時(shí)間戳數(shù)據(jù) Output_path=./output/ # 裁剪、轉(zhuǎn)格式后視頻文件輸出路徑 Qiniu_prefix=videos/source/ # 上傳七牛的路徑
讀取腳本如下
file=`sed '/^File=/!d;s/.*=//' config` cutConfig=`sed '/^Cut_config=/!d;s/.*=//' config` outputPath=`sed '/^Output_path=/!d;s/.*=//' config` qiniuPrefix=`sed '/^Qiniu_prefix=/!d;s/.*=//' config`
這里用到sed命令,sed 可依照腳本的指令來處理、編輯文本文件。在這里,我們主要是讀取配置文件中的鍵值對類型數(shù)據(jù)。
sed '/^File=/!d;s/.*=//' config
: 找到File=
開頭的行,然后!d
刪除這一行之外的行,將=
和=之前的字符
替換為空字符串,然后返回的就是=
后面的字符串。
讀取時(shí)間切片csv
視頻切片需要知道起止時(shí)間,以及切割完之后視頻的名字,這個(gè)數(shù)據(jù)組織方式比較適合csv,所以我們放到了csv中來管理,每一行代表一個(gè)視頻片段。
00:00:45,00:12:10,car-mainmaterial-from-commercial-vehicle 00:12:05,00:15:25,car-mainmaterial-from-nameplate 00:15:25,00:29:00,car-mainmaterial-from-certificate-registry 00:29:00,00:33:00,car-mainmaterial-from-driving-license 00:33:00,00:36:40,car-mainmaterial-from-cargo-import-permission 00:36:40,00:48:33,car-mainmaterial-from-practice-case
接下來就是解析csv文件。
# 變量聲明 count=0 # 計(jì)數(shù) videos=() # 視頻列表 # 遍歷 for line in $(cat $cutConfig) do OLD_IFS="$IFS" IFS="," # 用,切割字符串 arr=($line) # 切割完,得到三個(gè)字符串的數(shù)組 IFS="$OLD_IFS" # 恢復(fù)IFS videos[$count]="$outputPath${arr[2]}" # 存儲裁剪后的視頻片段文件名 count=$(($count+1)) # ffmpeg裁剪文件 ffmpeg -ss ${arr[0]} -t ${arr[1]} -i $file -vcodec copy -acodec copy $outputPath${arr[2]}.mp4 -loglevel quiet done
轉(zhuǎn)換視頻格式
# 轉(zhuǎn)換視頻格式 for video in ${videos[@]} do ffmpeg -i $video.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls $video.m3u8 done
上傳七牛
# 上傳視頻 qshell qupload2 --src-dir=$outputPath --bucket=assets --key-prefix=$qiniuPrefix --skip-suffixes=mp4 --overwrite=true --rescan-local=true
end
獲取視頻的時(shí)間切換,簡單用video標(biāo)簽寫了一個(gè)界面,通過拖拽快速或去起止時(shí)間,然后導(dǎo)出一個(gè)制定格式的CSV文件。
到此這篇關(guān)于shell腳本實(shí)現(xiàn)視頻處理的文章就介紹到這了,更多相關(guān)shell腳本視頻處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux命令學(xué)習(xí)之用戶切換su,sudo命令詳解
在操作過程中需要使用特定的用戶進(jìn)行特定的操作,多數(shù)情況下是因?yàn)闄?quán)限,比如要修改一個(gè)文件,只有root用戶有權(quán)限修改,那么就要切換到root用戶下進(jìn)行操作,本文給大家講解Linux命令學(xué)習(xí)之用戶切換su,sudo命令,感興趣的朋友跟隨小編一起看看吧2023-02-02查看linux中某個(gè)端口(port)是否被占用的方法
下面小編就為大家?guī)硪黄榭磍inux中某個(gè)端口(port)是否被占用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05linux shell流程控制語句實(shí)例講解(if、for、while、case語句實(shí)例)
linux shell有一套自己的流程控制語句,其中包括條件語句(if),循環(huán)語句(for,while),選擇語句(case)。下面我將通過例子介紹下,各個(gè)語句使用方法2014-04-04Linux 中awk 提取包含某個(gè)關(guān)鍵字的段落
AWK是一種處理文本文件的語言,是一個(gè)強(qiáng)大的文本分析工具。這篇文章主要介紹了Linux 中awk 提取包含某個(gè)關(guān)鍵字的段落實(shí)例代碼,需要的朋友可以參考下2020-01-01