文章目录
前言
调试代码离不开日志打印,俗称“打印大法”,要不怎么说新手程序猿往往“一招打印走天下”,哈哈。
本文记录下ffmpeg工具中loglevel参数的使用方法,便于学习代码的执行逻辑。
一、介绍下loglevel参数
通过loglevel参数可以控制日志信息,官网文档对loglevel参数的介绍如下:
简单总结如下:
repeat:加上这个flag后,对于重复的日志也会打印,不加的话,只会输出第一条,后面加上重复n次(Last message repeated n times);
level:加上这个flag后,输出的每条日志前会加上[level]信息,这样有啥用呢?就是当你拷贝到txt文档后,还可以根据这个字段来代替颜色信息;
loglevel:打印等级具体的值,可以是字符串也可以是数字。设置打印等级后,只能输出小于等于当前等级的日志信息,实现日志分级打印。
举个栗子:
//表示可以重复打印日志,加上[level]字段,使用verbose(啰嗦的/冗长的)的等级
ffmpeg -loglevel repeat+level+verbose -i input output
//使用+/-的方式处理flag,不影响其它flag
ffmpeg [...] -loglevel +repeat
二、测试验证
1.参数repeat+level+info
运行效果如下:
root@ubuntu:/home/ffmpeg/ffmpeg_build/bin# ./ffmpeg -loglevel repeat+level+info -i foreman_qcif.yuv -c:v libx264 foreman_qcif.h264
[info] ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
[info] built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
[info] configuration: --prefix=/home/ffmpeg/ffmpeg_build --disable-static --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/home/ffmpeg/x264_build/include --extra-ldflags=-L/home/ffmpeg/x264_build/lib
[info] libavutil 58. 29.100 / 58. 29.100
[info] libavcodec 60. 31.102 / 60. 31.102
[info] libavformat 60. 16.100 / 60. 16.100
[info] libavdevice 60. 3.100 / 60. 3.100
[info] libavfilter 9. 12.100 / 9. 12.100
[info] libswscale 7. 5.100 / 7. 5.100
[info] libswresample 4. 12.100 / 4. 12.100
[info] libpostproc 57. 3.100 / 57. 3.100
[info] Input #0, yuv4mpegpipe, from 'foreman_qcif.yuv':
[info] Duration: 00:00:10.01, start: 0.000000, bitrate: 9116 kb/s
[info] Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 176x144, SAR 128:117 DAR 1408:1053, 29.97 fps, 29.97 tbr, 29.97 tbn
File 'foreman_qcif.h264' already exists. Overwrite? [y/N] y
[info] Stream mapping:
[info] Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
[info] Press [q] to stop, [?] for help
[libx264 @ 0x55fb281ccd00] [info] using SAR=128/117
[libx264 @ 0x55fb281ccd00] [info] using cpu capabilities: none!
[libx264 @ 0x55fb281ccd00] [info] profile High, level 1.1, 4:2:0, 8-bit
[info] Output #0, h264, to 'foreman_qcif.h264':
[info] Metadata:
[info] encoder : Lavf60.16.100
[info] Stream #0:0: Video: h264, yuv420p(progressive), 176x144 [SAR 128:117 DAR 1408:1053], q=2-31, 29.97 fps, 29.97 tbn
[info] Metadata:
[info] encoder : Lavc60.31.102 libx264
[info] Side data:
[info] cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[out#0/h264 @ 0x55fb281c9bc0] [info] video:154kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
[info] frame= 300 fps=159 q=-1.0 Lsize= 154kB time=00:00:09.90 bitrate= 127.0kbits/s speed=5.26x
[libx264 @ 0x55fb281ccd00] [info] frame I:2 Avg QP:23.71 size: 5906
[libx264 @ 0x55fb281ccd00] [info] frame P:101 Avg QP:26.25 size: 1031
[libx264 @ 0x55fb281ccd00] [info] frame B:197 Avg QP:31.82 size: 210
[libx264 @ 0x55fb281ccd00] [info] consecutive B-frames: 8.0% 8.7% 14.0% 69.3%
[libx264 @ 0x55fb281ccd00] [info] mb I I16..4: 1.5% 36.9% 61.6%
[libx264 @ 0x55fb281ccd00] [info] mb P I16..4: 0.4% 2.8% 2.2% P16..4: 33.6% 28.9% 18.6% 0.0% 0.0% skip:13.5%
[libx264 @ 0x55fb281ccd00] [info] mb B I16..4: 0.0% 0.2% 0.1% B16..8: 45.2% 11.0% 2.6% direct: 2.0% skip:38.9% L0:37.8% L1:46.8% BI:15.4%
[libx264 @ 0x55fb281ccd00] [info] 8x8 transform intra:49.0% inter:56.7%
[libx264 @ 0x55fb281ccd00] [info] coded y,uvDC,uvAC intra: 86.8% 86.2% 60.5% inter: 17.5% 11.4% 2.0%
[libx264 @ 0x55fb281ccd00] [info] i16 v,h,dc,p: 48% 11% 4% 37%
[libx264 @ 0x55fb281ccd00] [info] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 16% 11% 4% 13% 13% 11% 7% 9%
[libx264 @ 0x55fb281ccd00] [info] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 15% 14% 4% 15% 9% 11% 6% 7%
[libx264 @ 0x55fb281ccd00] [info] i8c dc,h,v,p: 50% 17% 25% 8%
[libx264 @ 0x55fb281ccd00] [info] Weighted P-Frames: Y:5.0% UV:2.0%
[libx264 @ 0x55fb281ccd00] [info] ref P L0: 63.0% 18.3% 10.1% 8.3% 0.3%
[libx264 @ 0x55fb281ccd00] [info] ref B L0: 87.6% 9.3% 3.1%
[libx264 @ 0x55fb281ccd00] [info] ref B L1: 95.9% 4.1%
[libx264 @ 0x55fb281ccd00] [info] kb/s:125.73
可见在打印前面增加了[info]字段。
2.参数repeat+level+verbose
运行效果如下:
root@ubuntu:/home/ffmpeg/ffmpeg_build/bin# ./ffmpeg -loglevel repeat+level+verbose -i foreman_qcif.yuv -c:v libx264 foreman_qcif.h264
[info] ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
[info] built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
[info] configuration: --prefix=/home/ffmpeg/ffmpeg_build --disable-static --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/home/ffmpeg/x264_build/include --extra-ldflags=-L/home/ffmpeg/x264_build/lib
[info] libavutil 58. 29.100 / 58. 29.100
[info] libavcodec 60. 31.102 / 60. 31.102
[info] libavformat 60. 16.100 / 60. 16.100
[info] libavdevice 60. 3.100 / 60. 3.100
[info] libavfilter 9. 12.100 / 9. 12.100
[info] libswscale 7. 5.100 / 7. 5.100
[info] libswresample 4. 12.100 / 4. 12.100
[info] libpostproc 57. 3.100 / 57. 3.100
[info] Input #0, yuv4mpegpipe, from 'foreman_qcif.yuv':
[info] Duration: 00:00:10.01, start: 0.000000, bitrate: 9116 kb/s
[info] Stream #0:0: Video: rawvideo, 1 reference frame (I420 / 0x30323449), yuv420p(progressive), 176x144, SAR 128:117 DAR 1408:1053, 29.97 fps, 29.97 tbr, 29.97 tbn
[out#0/h264 @ 0x5651003fabc0] [verbose] No explicit maps, mapping streams automatically...
[vost#0:0/libx264 @ 0x5651003fd900] [verbose] Created video stream from input stream 0:0
File 'foreman_qcif.h264' already exists. Overwrite? [y/N] y
[info] Stream mapping:
[info] Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
[info] Press [q] to stop, [?] for help
[graph 0 input from stream 0:0 @ 0x565100400300] [verbose] w:176 h:144 pixfmt:yuv420p tb:1001/30000 fr:30000/1001 sar:128/117
[libx264 @ 0x5651003fdd00] [info] using SAR=128/117
[libx264 @ 0x5651003fdd00] [info] using cpu capabilities: none!
[libx264 @ 0x5651003fdd00] [info] profile High, level 1.1, 4:2:0, 8-bit
[info] Output #0, h264, to 'foreman_qcif.h264':
[info] Metadata:
[info] encoder : Lavf60.16.100
[info] Stream #0:0: Video: h264, 1 reference frame, yuv420p(progressive), 176x144 (0x0) [SAR 128:117 DAR 1408:1053], q=2-31, 29.97 fps, 29.97 tbn
[info] Metadata:
[info] encoder : Lavc60.31.102 libx264
[info] Side data:
[info] cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[in#0/yuv4mpegpipe @ 0x5651003f9440] [verbose] EOF while reading inputrate= 137.5kbits/s speed=4.75x
[in#0/yuv4mpegpipe @ 0x5651003f9440] [verbose] Terminating demuxer thread
[vist#0:0/rawvideo @ 0x5651003fc1c0] [verbose] Decoder thread received EOF packet
[vist#0:0/rawvideo @ 0x5651003fc1c0] [verbose] Decoder returned EOF, finishing
[vist#0:0/rawvideo @ 0x5651003fc1c0] [verbose] Terminating decoder thread
[verbose] No more output streams to write to, finishing.
[out#0/h264 @ 0x5651003fabc0] [verbose] All streams finished
[out#0/h264 @ 0x5651003fabc0] [verbose] Terminating muxer thread
[AVIOContext @ 0x5651004015c0] [verbose] Statistics: 157316 bytes written, 0 seeks, 1 writeouts
[out#0/h264 @ 0x5651003fabc0] [verbose] Output file #0 (foreman_qcif.h264):
[out#0/h264 @ 0x5651003fabc0] [verbose] Output stream #0:0 (video): 300 frames encoded; 300 packets muxed (157316 bytes);
[out#0/h264 @ 0x5651003fabc0] [verbose] Total: 300 packets (157316 bytes) muxed
[out#0/h264 @ 0x5651003fabc0] [info] video:154kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
[info] frame= 300 fps=156 q=-1.0 Lsize= 154kB time=00:00:09.90 bitrate= 127.0kbits/s speed=5.16x
[libx264 @ 0x5651003fdd00] [info] frame I:2 Avg QP:23.71 size: 5906
[libx264 @ 0x5651003fdd00] [info] frame P:101 Avg QP:26.25 size: 1031
[libx264 @ 0x5651003fdd00] [info] frame B:197 Avg QP:31.82 size: 210
[libx264 @ 0x5651003fdd00] [info] consecutive B-frames: 8.0% 8.7% 14.0% 69.3%
[libx264 @ 0x5651003fdd00] [info] mb I I16..4: 1.5% 36.9% 61.6%
[libx264 @ 0x5651003fdd00] [info] mb P I16..4: 0.4% 2.8% 2.2% P16..4: 33.6% 28.9% 18.6% 0.0% 0.0% skip:13.5%
[libx264 @ 0x5651003fdd00] [info] mb B I16..4: 0.0% 0.2% 0.1% B16..8: 45.2% 11.0% 2.6% direct: 2.0% skip:38.9% L0:37.8% L1:46.8% BI:15.4%
[libx264 @ 0x5651003fdd00] [info] 8x8 transform intra:49.0% inter:56.7%
[libx264 @ 0x5651003fdd00] [info] coded y,uvDC,uvAC intra: 86.8% 86.2% 60.5% inter: 17.5% 11.4% 2.0%
[libx264 @ 0x5651003fdd00] [info] i16 v,h,dc,p: 48% 11% 4% 37%
[libx264 @ 0x5651003fdd00] [info] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 16% 11% 4% 13% 13% 11% 7% 9%
[libx264 @ 0x5651003fdd00] [info] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 15% 14% 4% 15% 9% 11% 6% 7%
[libx264 @ 0x5651003fdd00] [info] i8c dc,h,v,p: 50% 17% 25% 8%
[libx264 @ 0x5651003fdd00] [info] Weighted P-Frames: Y:5.0% UV:2.0%
[libx264 @ 0x5651003fdd00] [info] ref P L0: 63.0% 18.3% 10.1% 8.3% 0.3%
[libx264 @ 0x5651003fdd00] [info] ref B L0: 87.6% 9.3% 3.1%
[libx264 @ 0x5651003fdd00] [info] ref B L1: 95.9% 4.1%
[libx264 @ 0x5651003fdd00] [info] kb/s:125.73
[in#0/yuv4mpegpipe @ 0x5651003f9440] [verbose] Input file #0 (foreman_qcif.yuv):
[in#0/yuv4mpegpipe @ 0x5651003f9440] [verbose] Input stream #0:0 (video): 300 packets read (11404800 bytes); 300 frames decoded; 0 decode errors;
[in#0/yuv4mpegpipe @ 0x5651003f9440] [verbose] Total: 300 packets (11404800 bytes) demuxed
[AVIOContext @ 0x565100402200] [verbose] Statistics: 11406644 bytes read, 0 seeks
可以看到增加了几行包含[verbose]信息的打印,日志更加丰富了有木有?
3.参数repeat+level+warning
运行效果如下:
root@ubuntu:/home/ffmpeg/ffmpeg_build/bin# ./ffmpeg -loglevel repeat+level+warning -i foreman_qcif.yuv -c:v libx264 foreman_qcif.h264
File 'foreman_qcif.h264' already exists. Overwrite? [y/N] y
可见限制了打印等级为warning后,正常的info信息就没了,实现了日志分级的效果,调试时候更加清爽有木有?
总结
本文验证了ffmpeg中loglevel参数的使用方法,便于后续学习源码的代码逻辑。