ffplay出现h264或者no frame或者missing picture in access unit with size 1392错误

本文介绍了在使用ffplay播放RTSP流时遇到的H264错误和noframe、missingpicture问题的排查方法。通过Wireshark抓包分析,发现H265帧头异常,并提供了修复帧头的解码操作。此外,还提到了通过修改ffmpeg源码解决RTSP/SDP包中编码类型错误的方法。
摘要由CSDN通过智能技术生成

ffmpeg,ffplay,拉rtsp流出现h264@xxx错误和no frame!和missing picture in access unit with size 1392错误

情景介绍

在使用ffplay播放rtsp监控时候,有时候会出现h264 @ 0x00000000000之类的地址开头错误,以及提示信息no frame!missing picture in access unit with size 1392

排查方法

我的使用场景是两个摄像头一个使用H264一个使用H265,然后H264的正常播放,H265播放会报上面错误,查找方法:

Wireshark抓包分析帧

1、添加H265插件。
免费下载地址链接: link.,里面包含H264等蛮全面的。
2.、将 rtp_h265_export.lua 丢进WireShark的根目录,右键WireShark打开文件路径;
3、找到 init.lua 文件,打开拉到最下面,添加字段dofile(DATA_DIR…“rtp_h265_export.lua”);
在这里插入图片描述

4、设置WireShark ;
在这里插入图片描述
先抓包,看Payload,图上1序号为96.然后找到4步骤填入。
5、发现VPS、SPS、PPS帧都有,且顺序是40、42、44。真正的头其实是00 00 00 01 40 、00 00 00 01 42 、00 00 00 01 44 、这边只能显示40。如下图。
VPS数据
6、用16进制软件打开会更好观察.这边用HxD.exe软件打开无法播放的H265文件。并且搜索00 00 00 01
如下图解码后能播放出来的文件。
正常H265

7、不能播放的帧如下图。
没解码的文件
可以看到和正常的区别就是00 00 00 01 62 01 93 AF 变成了 00 00 00 01 26 01 AF,且接下来的62 01 13都是这个00 00 00 01 26 01 AF里面的画面,只是变成了包。多个包通过解码才是正常的帧。

8、参考 从RTP包中解析H265数据.文章,发现需要通过代码所示解码操作。就能变成完整的数据。00 00 00 01 62 01 93 AF格式的头是与40、42、44所在一帧里面的数据头。下一帧就直接是00 00 00 01 62 03 81 D0 00开头。00 00 00 01 62 01 13只是中间包的头,每个包的00 00 00 01 62 01 13需要删掉,剩下的数据拼接在上一个包的尾巴。00 00 00 01 62 03 81 D0 00帧头中的81与80&。大于0就是帧头。同时62改成02,81删掉。尾包头00 00 00 01 62 01 53,53&40大于0,是帧尾。00 00 00 01 62 01 53删掉,剩下数据填入上个包尾。都是和81、13、53这个位置的数值与。到下一个00 00 00 01 40 01 0C后,又是找到00 00 00 01 62 01 93 AF。62变成26,93删掉。如此循环。
9、批量替换HXD不能把数据删除。我用的是UltraEdit。最后就能播了。
10、C代码实现也有,这里就不放上来了。需要注意的是
(1)、一个包里有可能有中间帧和尾帧和帧头。需要注意保存,然后去拼接相应地方。
(2)、我用的是数组保存,要注意【0】、【1】.中的数据是否正确。最好打印出来关键字眼。有时候会多放数据进去。照成段错误、malloc、free的错误提示。

第二个方法

rtsp包
1、在抓包中找到RTSP/SDP的包。找到图中所示rtpmap:96 H264/90000的地方。
2、在ffmpeg源码中修改对应的值。具体操作是源码libavformat/rtsp.c 文件中sdp_parse_line函数。
av_log(s, AV_LOG_TRACE, “sdp: %c=‘%s’\n”, letter, buf);
p = buf;
有着两行。其中buf内容为rtpmap:96 H264/90000。如果抓包数据中是H264,出现播放不出来。报错。就把buf内容的H264改成H265。如果抓包数据中是H265,出现播放不出来。报错。就把buf内容的H265改成H264。然后编译,编译命令为sudo make install 在执行ffplay url操作就能播了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值