ffmpeg命令行录制一个具有非IDR性质的I帧的视频

之前在代码上写过几篇ffmpeg桌面录制的博客,用ffprobe查看里面的帧时,全部都是IDR这种I帧,没有普通的I帧,如下所示:

<frame media_type="video" stream_index="0" key_frame="1" pkt_pts="0" pkt_pts_time="0.000000" pkt_dts="0" pkt_dts_time="0.000000" best_effort_timestamp="0" best_effort_timestamp_time="0.000000" pkt_duration="1001" pkt_duration_time="0.033367" pkt_pos="48" pkt_size="167365" width="1920" height="1080" pix_fmt="yuv444p" pict_type="I" coded_picture_number="0" display_picture_number="0" interlaced_frame="0" top_field_first="0" repeat_pict="0" chroma_location="left"/>

其中字段key_frame=1表示IDR帧,显然后面的pict_type为"I"表示I帧。

非IDR的I帧的key_frame=0,pict_type为"I"。

现在录制一个带有普通I帧的视频,需要用到x264里面的keyint_min参数,命令行如下:

ffmpeg -f gdigrab -i desktop -c:v libx264 -keyint_min 10 -g 20 -f mp4 2022_10_10_17_53.mp4

其中-g 20表示gop为20,即每20个帧中产生一个IDR帧。keyint_min的详细含义复杂一些,本处暂不敢做解释,关于这方面的博客也很多,读者可以自己查。

上面录制桌面屏幕的时候,请保持屏幕晃动的厉害(可以频繁对某个窗口最小化和还原处理),否则普通I帧未必产生,录制一小会后,按q停止录制。

然后通过如下的命令行产生帧xml

ffprobe -of xml -show_frames -i 2022_10_10_17_53.mp4 >2022_10_10_17_53.xml

然后仔细搜寻,搜寻出下面这一行:

<frame media_type="video" stream_index="0" key_frame="0" pkt_pts="377377" pkt_pts_time="12.579233" pkt_dts="377377" pkt_dts_time="12.579233" best_effort_timestamp="377377" best_effort_timestamp_time="12.579233" pkt_duration="1001" pkt_duration_time="0.033367" pkt_pos="6612663" pkt_size="419872" width="1920" height="1080" pix_fmt="yuv444p" pict_type="I" coded_picture_number="377" display_picture_number="0" interlaced_frame="0" top_field_first="0" repeat_pict="0" chroma_location="left"/>

很明显可以看到key_frame为0,但是pict_type=“I”,是普通的I帧,同时,我们将mp4转成h264裸流文件。

ffmpeg -i 2022_10_10_17_53.mp4 -c copy 2022_10_10_17_53.h264

然后用下面工具查看帧情况
在这里插入图片描述
截图中共有3个I帧,其中第一个和第三个是IDR帧,前面都紧跟着SPS和PPS,第二个是普通I帧,前面没有SPS和PPS。

IDR帧的nal_unit_type是5,普通I帧的nal_unit_type是1,故在nalu的 header中,只能检测出IDR帧,无法判断是否是普通I帧,因为普通I帧,P帧,B帧的nal_unit_type可能都是1,进一步的判断需要slice_type。

注意:上述的mp4文件的像素格式是yuv444p,很多播放器无法播放,就连eseye_u.exe在播放2022_10_10_17_53.h264时会直接崩溃,解决办法可以将像素格式修改成yuv420p。
对应的命令如下

ffmpeg.exe -i 2022_10_10_17_53.mp4 -pix_fmt yuv420p 2022_10_10_17_53_yuv420p.mp4
ffmpeg -i 2022_10_10_17_53_yuv420p.mp4 -c copy 2022_10_10_17_53_yuv420p.h264

这样产生的2022_10_10_17_53_yuv420p.h264可以拖到eseye_u.exe播放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值