FFmpeg 自动化测试用例二(md5 测试用例)

编写 FFmpeg 自动化测试用例时除了 framecrc 之外,还可以按照类似于查看文件 md5 的方式来进行数据对比。这种对比方式相对于 framecrc 的方式稍微简洁一些,下面详细介绍一下。

测试用例展现方式

我们先来看一下 md5 的测试用例的样本:

tests/data/live_last_endlist.m3u8: TAG = GEN
tests/data/live_last_endlist.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
        $(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
        -f lavfi -v verbose -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 \
        -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/live_last_endlist_%03d.ts \
        $(TARGET_PATH)/tests/data/live_last_endlist.m3u8 2>/dev/null

FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-live-last-endlist
fate-hls-live-last-endlist: tests/data/live_last_endlist.m3u8
fate-hls-live-last-endlist: SRC = $(TARGET_PATH)/tests/data/live_last_endlist.m3u8
fate-hls-live-last-endlist: CMD = md5 -i $(SRC) -af hdcd=process_stereo=false -t 6 -f s24le
fate-hls-live-last-endlist: CMP = oneline
fate-hls-live-last-endlist: REF = 2ca8567092dcf01e37bedd50454d1ab7

从这个例子中可以看到,一共包含了两个 Label, 一个是 fate-hls-live-last-endlist, 另一个是 tests/data/live_last_endlist.m3u8,

这个用例主要是测试生成的带 EXT-X-ENDLIST 的m3u8文件的正确性,生成了 m3u8 文件媒体文件之后,通过 shell 实现的 md5 函数来 生成一个 md5 串,来判断这个 m3u8 媒体内容是否与原来设定的 m3u8 内容一致。

下面看一下 shell 的 md5 的内容,脚本相关的函数实现可以在文件 tests/fate-run.sh 中找到:


if [ X"$(echo | md5sum -b 2> /dev/null)" != X ]; then
    do_md5sum() { md5sum -b $1; }
elif [ X"$(echo | command md5 2> /dev/null)" != X ]; then
    do_md5sum() { command md5 $1 | sed 's#MD5 (\(.*\)) = \(.*\)#\2 *\1#'; }
elif [ -x /sbin/md5 ]; then
    do_md5sum() { /sbin/md5 -r $1 | sed 's/\([0-9a-f]\) [ *]*/\1 */'; }
elif openssl version >/dev/null 2>&1; then
    do_md5sum() { openssl md5 $1 | sed 's/MD5(\(.*\))= \(.*\)/\2 *\1/'; }
else
    do_md5sum() { echo No md5sum program found; }
fi

oneline(){
    printf '%s\n' "$1" | diff -u -b - "$2"
}
md5(){
    encfile="${outdir}/${test}.out"
    cleanfiles="$cleanfiles $encfile"
    ffmpeg "$@" $encfile
    do_md5sum $encfile | awk '{print $1}'
}

从上面的内容看,基本上能够手动搞定测试过程:

ffmpeg -f lavfi -v verbose -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 -codec:a mp2fixed -hls_segment_filename tests/data/live_last_endlist_%03d.ts tests/data/live_last_endlist.m3u8

首先生成一个 m3u8,然后根据 m3u8 生成一个临时的 out 文件,是解码后的文件 a.out:

ffmpeg -i tests/data/live_last_endlist.m3u8 -af hdcd=process_stereo=false -t 6 -f s24le a.out

然后我们 md5 看一下 a.out 的内容:

bogon:~ liuqi$ openssl md5 a.out
MD5(a.out)= 2ca8567092dcf01e37bedd50454d1ab7

从输出的内容中可以看到,与预先设置的 REF 是相同的,这个内容会通过

awk '{print $1}'

取出,然后进行 CMP,这个 CMP 的实现是 oneline 那一行中可以得到:

    printf '%s\n' "$1" | diff -u -b - "$2"

如果想看到详细过程,可以通过 make fate 来看到:


bogon:dash liuqi$ make fate-hls-live-last-endlist V=1
/Users/liuqi/multimedia/ffmpeg/dash/ffmpeg \
        -f lavfi -v verbose -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 \
        -codec:a mp2fixed -hls_segment_filename /Users/liuqi/multimedia/ffmpeg/dash/tests/data/live_last_endlist_%03d.ts \
        /Users/liuqi/multimedia/ffmpeg/dash/tests/data/live_last_endlist.m3u8 2>/dev/null
TEST    hls-live-last-endlist
src/tests/fate-run.sh fate-hls-live-last-endlist "fate-suite/" "" "/Users/liuqi/multimedia/ffmpeg/dash" 'md5 -i /Users/liuqi/multimedia/ffmpeg/dash/tests/data/live_last_endlist.m3u8 -af hdcd=process_stereo=false -t 6 -f s24le' 'oneline' '2ca8567092dcf01e37bedd50454d1ab7' '' '1' '' '' '' '' '' '' '' '' '' ''
 /Users/liuqi/multimedia/ffmpeg/dash/ffmpeg -nostdin -nostats -cpuflags all -hwaccel none -threads 1 -thread_type frame+slice -i /Users/liuqi/multimedia/ffmpeg/dash/tests/data/live_last_endlist.m3u8 -af hdcd=process_stereo=false -t 6 -f s24le tests/data/fate/hls-live-last-endlist.out
bogon:dash liuqi$

好,客位看官,到这里就结束了,fate 编写相信也深得其精髓了,接下来可以自己尝试着做一做自测程序了。

作者:悟空 公众号:流媒体技术

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论