運行環境:
Ubuntu16.04(推薦)
FFmpeg
jsvm
dash-svc-toolchain
運行前準備:
jsvm_config裏的文件拷貝到jsvm的bin文件下,source文件夾存放原視頻
打開SVC_coder.sh文件,把FFmpeg、jsvm、dash-svc-toolchain的路徑寫好
量化參數自己配置
運行腳本即可。
源碼:
#!/bin/bash
#................................................................................................................................................................................
#路徑變量(可以修改的,要注意,一般'~'相當於'/home/htc'):
path_SVC_coder=/home/nnt/桌面/360/SVC_coder
path_ffmpeg=/home/nnt/桌面/360/ffmpeg-3.2.10
path_jsvm=/home/nnt/桌面/360/jsvm
path_DASH_SVC=/home/nnt/桌面/360/DASH-SVC-Toolchain
#................................................................................................................................................................................
#視頻屬性:
#video_frames:需要編碼的幀數。在MP4文件中,index:0 指的是視頻部分(AVC);而index:1指的是音頻部分(AAC)
#frame_rate:視頻幀率,在視頻中,r_frame_rate指的是實際幀率;avg_frame_rate指的是平均幀率
#................................................................................................................................................................................
#接口設置
#QP0:基礎層質量(0-51),也就是第一層質量(如:28) 數值越高越模糊,數值越低越清晰
#QP1:增強層質量(0-51),也就是第二層質量(如:24)
#QP2:增強層質量(0-51),也就是第三層質量(如:21)
#................................................................................................................................................................................
#測試用數據()
QP0=28
QP1=24
QP2=20
#開始!!!!!
cd $path_SVC_coder/source
filelist=`ls`
for file in $filelist
do
video_name=$file
cp $video_name $path_ffmpeg/
echo $video_name
cd $path_ffmpeg
./ffmpeg -i $video_name -an -g 12 -bf 0 temp.mp4 #轉爲MP4格式
rm $video_name
mv temp.mp4 ${video_name%.*}.mp4
video_name=${video_name%.*}.mp4
ffprobe -v quiet -print_format json -show_streams $video_name > information #獲取視頻屬性
cat information
video_width=$(grep '\<width\>' information | cut -d ':' -f 2|cut -d ' ' -f 2|cut -d ',' -f 1) #var=$(表達式),可以進行傳值;grep中,\<...\>表示,除了...之外,這個單詞不包含別的字母了
video_height=$(grep '\<height\>' information |cut -d ':' -f 2|cut -d ' ' -f 2|cut -d ',' -f 1) #grep來定位行,cut來切出關鍵字【cut、grep:鳥p334】
video_frames=$(grep '\<nb_frames\>' information | head -1 | cut -d ':' -f 2|cut -d '"' -f 2) #head -1顯示第一行,若-n,顯示第n行,tail和他相反;這指視頻幀數。第二行音頻幀數可以不用
#幀率的獲取
a=$(grep '\<r_frame_rate\>' information | head -1 | cut -d ':' -f 2|cut -d '"' -f 2|cut -d '/' -f 1)
b=$(grep '\<r_frame_rate\>' information | head -1 | cut -d ':' -f 2|cut -d '"' -f 2|cut -d '/' -f 2)
y=$(echo "scale=1; $a/$b+0.5" | bc) #scale在這我想是小數點後的位數(博客看到的方法)
frame_rate=`printf '%.0f' $y`
segment_period=$(($frame_rate*2)) #段長(*2指的是2s一段,可以在此修改段長!!!!)
cd $path_jsvm/bin
#sed -i指的是直接修改文件內容,"..."中,4c指的是第4行,這裏把整行改掉
sed -i "4c FrameRate $frame_rate # Maximum frame rate [Hz]" adaptive_streams.cfg
sed -i "5c FramesToBeEncoded $video_frames # Number of frames" adaptive_streams.cfg
#sed -i "9c IntraPeriod $segment_period # Intra Period" adaptive_streams.cfg
sed -i "3c OutputFile ${video_name%.*}.264 # Bitstream file" adaptive_streams.cfg
for layer in 0 1 2
do
sed -i "4c InputFile ${video_name%.*}.yuv # Input file" layer_$layer.cfg
sed -i "6c SourceWidth $video_width # Input frame width" layer_$layer.cfg
sed -i "7c SourceHeight $video_height # Input frame height" layer_$layer.cfg
sed -i "9c FrameRateIn $frame_rate # Input frame rate [Hz]" layer_$layer.cfg
sed -i "10c FrameRateOut $frame_rate # Output frame rate [Hz]" layer_$layer.cfg
sed -i "12c IDRPeriod $segment_period" layer_$layer.cfg
done
sed -i "15c QP $QP0 # Quantization parameters" layer_0.cfg
sed -i "16c MeQP0 $QP0 # QP for mot. est. / mode decision (stage 0)" layer_0.cfg
sed -i "17c MeQP1 $QP0 # QP for mot. est. / mode decision (stage 1)" layer_0.cfg
sed -i "18c MeQP2 $QP0 # QP for mot. est. / mode decision (stage 2)" layer_0.cfg
sed -i "19c MeQP3 $QP0 # QP for mot. est. / mode decision (stage 3)" layer_0.cfg
sed -i "20c MeQP4 $QP0 # QP for mot. est. / mode decision (stage 4)" layer_0.cfg
sed -i "21c MeQP5 $QP0 # QP for mot. est. / mode decision (stage 5)" layer_0.cfg
sed -i "16c QP $QP1 # Quantization parameters" layer_1.cfg
sed -i "17c MeQP0 $QP1 # QP for mot. est. / mode decision (stage 0)" layer_1.cfg
sed -i "18c MeQP1 $QP1 # QP for mot. est. / mode decision (stage 1)" layer_1.cfg
sed -i "19c MeQP2 $QP1 # QP for mot. est. / mode decision (stage 2)" layer_1.cfg
sed -i "20c MeQP3 $QP1 # QP for mot. est. / mode decision (stage 3)" layer_1.cfg
sed -i "21c MeQP4 $QP1 # QP for mot. est. / mode decision (stage 4)" layer_1.cfg
sed -i "22c MeQP5 $QP1 # QP for mot. est. / mode decision (stage 5)" layer_1.cfg
sed -i "16c QP $QP2 # Quantization parameters" layer_2.cfg
sed -i "17c MeQP0 $QP2 # QP for mot. est. / mode decision (stage 0)" layer_2.cfg
sed -i "18c MeQP1 $QP2 # QP for mot. est. / mode decision (stage 1)" layer_2.cfg
sed -i "19c MeQP2 $QP2 # QP for mot. est. / mode decision (stage 2)" layer_2.cfg
sed -i "20c MeQP3 $QP2 # QP for mot. est. / mode decision (stage 3)" layer_2.cfg
sed -i "21c MeQP4 $QP2 # QP for mot. est. / mode decision (stage 4)" layer_2.cfg
sed -i "22c MeQP5 $QP2 # QP for mot. est. / mode decision (stage 5)" layer_2.cfg
cd $path_ffmpeg
./ffmpeg -i $video_name ${video_name%.*}.yuv
mv -f ${video_name%.*}.yuv $path_jsvm/bin/
cd $path_jsvm/bin
./H264AVCEncoderLibTestStatic -pf adaptive_streams.cfg
mv -f ${video_name%.*}.264 $path_DASH_SVC/demultiplex/
rm ${video_name%.*}.yuv
cd $path_DASH_SVC/demultiplex
#
for i in $(seq 0 120)
do
python demultiplex.py ${video_name%.*}.264 $segment_period DASH_streams/${video_name%.*}/ $frame_rate $i http://192.168.1.2/video/ > result-${video_name%.*}_$i
count=$(grep -c '\<WARNING\>' result-${video_name%.*}_$i)
if [ $count -eq 0 ];then
echo "$i is right!!!"
#mv -f result-${video_name%.*}_$i results/
break
else
echo "$i has $count Warnings!!!!!!"
cd DASH_streams
rm -rf ${video_name%.*}
cd ..
rm -f result-${video_name%.*}_$i
fi
done
#python demultiplex.py ${video_name%.*}.264 $segment_period DASH_streams/${video_name%.*}/ $frame_rate 60 http://192.168.1.2/video/ > ${video_name%.*}-result.txt
mv -f ${video_name%.*}.mpd DASH_streams/${video_name%.*}/
mv -f ${video_name%.*}.264 $path_SVC_coder/temp/
#rm $temp.264
cd $path_SVC_coder/source
done
對代碼有疑問或者感興趣的歡迎私信我~