批量編碼SVC-DASH流腳本

運行環境:

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
 

對代碼有疑問或者感興趣的歡迎私信我~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章