批量编码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
 

对代码有疑问或者感兴趣的欢迎私信我~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值