运行环境:
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
对代码有疑问或者感兴趣的欢迎私信我~