利用ffmpeg生成测试用的码流

可以利用ffmpeg里带的muxing.c,生成mp4封装的h264码流,然后再用ffmpeg的drawtext filter给码流加上时间osd。

  1. mux

把ffmpeg源码目录下的doc/examples/muxing.c拷贝出来,再把libavcodec.a,libavformat.a,libavutil.a,libswresample.a,libswscale.a,libx264.a,libx265.a拷贝到同级目录下,新建Makefile,如下所示:

INC=/xxx/ffmpeg-4.2.3./
LIBS=-lstdc++ -lrt -ldl -lm -lz -lpthread -Wl,--start-group *.a -Wl,--end-group

mux: *.a muxing.c
    gcc muxing.c -o $@ -I$(INC) $(LIBS)

执行 make mux 即可进行编译。
程序编译出来后,执行 ./mux xxx.mp4 即可生成码流。
程序会根据用户输入的文件名参数的后缀,推测需要的封装格式,比如这里就是mp4封装格式。而码流的编码格式,比如这里是h264,应该也是程序自己推测决定的。

默认的码流长度是10秒。可以修改代码里的STREAM_DURATION宏定义来改变码流长度。

编码用的源yuv,也是程序里自动填充的,填充的效果是会动态变化的彩条画面。如果想进一步减小码流大小,用单色画面,则可以修改fill_yuv_image函数,把里面的Y,Cb,Cr填充成固定值即可。

另外,如果想让码流里不带音频帧,仅仅注释掉have_audio=1,encode_audio=1还不够,还要把add_stream(audio)的语句也注释掉。

最后,还不清楚附加参数-flags,-fflags的用法。如果把原先的-flags,-fflags两行代码注释掉,改成

    av_dict_set(&opt, argv[i], argv[i]+1, 0);

然后执行 ./mux xxx.mp4 profile baseline ,是可以生成不带B帧的baseline码流的(默认是High profile)。

  1. ffmpeg支持drawtext

下载libfreetype(https://mirror.yongbok.net/nongnu/freetype/freetype-2.9.tar.gz)
然后解压编译:

tar -xf freetype-2.9.tar.gz
cd freetype-2.9
./configure --prefix=/home/test/dist/
make
make install

(可能需要手动修改freetype2.pc, 在Libs项后面加 -lz)

重新配置编译ffmpeg

PKG_CONFIG_PATH="/home/test/dist/lib/pkgconfig" ./configure --disable-x86asm --enable-libx265 --enable-libx264 --enable-gpl --enable-filter=drawtext --enable-libfreetype
make clean
make
  1. drawtext

把pts转成时分秒,时间osd形式是hh:mm:ss.msec

ffmpeg -i ./xxx.mp4 -vf "drawtext=fontfile=xxx/xxx.ttf: text='%{pts\:hms}': x=0: y=0: fontcolor=white: box=1: boxcolor=0x00000000@1" ./yyy.mp4

把pts转成本地时间(0对应1970年1月1号早上8点),时间osd形式是 yyyy-mm-dd hh:mm:ss

ffmpeg -i ./xxx.mp4 -vf "drawtext=fontfile=xxx/xxx.ttf: text='%{pts\:localtime}': x=0: y=0: fontcolor=white: box=1: boxcolor=0x00000000@1" ./yyy.mp4

把pts转成本地时间(加上时间偏移量xxxxxxxx),时间osd形式是 yyyy-mm-dd hh:mm:ss

ffmpeg -i ./xxx.mp4 -vf "drawtext=fontfile=xxx/xxx.ttf: text='%{pts\:localtime\:xxxxxxxx}': x=0: y=0: fontcolor=white: box=1: boxcolor=0x00000000@1" ./yyy.mp4

一般pts都是从0开始,生成测试码流时,修改muxing.c里面的video_st.next_pts初始值(相应也要修改STREAM_DURATION),可以让码流的pts不是从0开始。但即使这样,drawtext时,取到的pts初值还是0(可能是把首帧的pts做基准0,而不管具体的pts值)。

用 ffprobe -show_frames -of csv xxx.mp4 可以逐帧查看帧信息,包括pts。csv可以换成其他的,比如flat,json等,以便显示详细信息。

你可能感兴趣的:(利用ffmpeg生成测试用的码流)