最近一线同事反映,视频流解码后出现花屏现象。于是我让现场人员用wireshark抓一下包,发现服务器拉流走的是UDP协议的流,怪不得会花屏,网络差的时候,丢包是肯定的了。将花屏的视频文件下载下来后,发现是PS封装的H264。重点是有的PS文件能用ffplay播放,有的不能。我就纳闷了,本着上次被海康平台坑过一回的阴影,还是自己写一个从PS文件里面提取H264裸码流数据的小工具为好。

结果发现,出现问题的PS文件的第一个PS-packet的pes_packet_length比实际的大,而剩下的其他PS包都是正常的,说明第一个PS包出现了问题,从而导致ffmpeg打开失败,ffmpeg解析PS的代码文件为 ffmpeg-3.2.4/libavformat/mpeg.c


static int mpegps_read_pes_header(AVFormatContext *s,int64_t *ppos, int *pstart_code,int64_t *ppts, int64_t *pdts)
{MpegDemuxContext *m = s->priv_data;int len, size, startcode, c, flags, header_len;int pes_ext, ext2_len, id_ext, skip;int64_t pts, dts;int64_t last_sync = avio_tell(s->pb);
... .../* find matching stream */if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||(startcode >= 0x1e0 && startcode <= 0x1ef) ||(startcode == 0x1bd) ||(startcode == PRIVATE_STREAM_2) ||(startcode == 0x1fd)))goto redo;if (ppos) {*ppos = avio_tell(s->pb) - 4;}len = avio_rb16(s->pb); //此处即为 pes_packet_length (16bits)pts =dts = AV_NOPTS_VALUE;if (startcode != PRIVATE_STREAM_2){/* stuffing */for (;;) {if (len < 1)goto error_redo;c = avio_r8(s->pb);len--;/* XXX: for MPEG-1, should test only bit 7 */if (c != 0xff)break;}
... ...
}

ffmpeg中直接读取的pes_packet_length值作为PES包的大小,而实际上,此PES包所在的PS包总大小比pes_packet_length小,从而导致ffmpeg将下一个PS Header误认为是H264数据,后续的所有PS包都会出现定位不准。这种情况,有两种解决办法,

1. 不相信pes_packet_length的值,先找到两个相邻的PS包头的位置,即找到相邻的两个 00 00 01 BA 包起始码位置,比如pos1和pos2,那么只需要在 [pos1, pos2] 范围内查找所有的PES包起始码 00 00 01 E0 ,就可以找到每个PS包中含有的所有PES包,对于每一个PES包,跳过PES header,剩下的就是H264裸码流数据了,把这些H264数据保存到同一个文件中就可以了

2. 既然是 pes_packet_length 的值不正确,那么将原始的pes_packet_length值对应修改正确就可以了

最后说一句,下载的PS文件中的program_stream_map_length跟ISO/IEC文档定义的不一样,HIK又一个坑

工程地址:https://github.com/jfu222/ps_h264_payload_split

从PS视频流中提取H264数据相关推荐

  1. 二 . 从海康的ps流中提取h264数据(模拟ehome平台)

    经过 一  可以轻松的获取设备的tcp视频流. 下面解码过程过程. 解码参考: https://blog.csdn.net/jisuanji_wjfioj/article/details/404304 ...

  2. wireshark提取视频数据之RTP包中提取H264和H265

    wireshark提取视频数据之RTP包中提取H264和H265 文章目录 wireshark提取视频数据之RTP包中提取H264和H265 1 背景 2 提取前工作 3 H264视频从RTP包中提取 ...

  3. 【Android音视频开发】【032】Android从RTMP流中提取H264和AAC数据进行播放

    前篇 在上篇博客中,我们已经讲解过,如何从RTMP流中提取H264和AAC数据,并保存为FLV,AAC,H264等文件 这篇博客我们讲解,怎么通过Android多媒体框架播放这些数据 上篇博客的重点在 ...

  4. 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...

  5. [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:skyseraph00@163 .com 一.MP4格式基 ...

  6. 流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    源地址:http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html [流媒體]H264-MP4格式及在MP4文件中提取H264的S ...

  7. 【转载】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概 ...

  8. android字符串获取数字索引,从字符串中提取特定数据(Extract specific data from a string)...

    从字符串中提取特定数据(Extract specific data from a string) 我有一个带有描述的长字符串. 我想从字符串中提取一些信息. 但我无法弄明白该怎么做. 这是字符串: C ...

  9. Camelot:从pdf中提取表格数据

    Camelot:从pdf中提取表格数据 文章目录: 一.Camelot的介绍和安装 1. Camelot介绍 2. Camelot的安装 3. 其他 二.Camelot的使用 1. 快速入门使用 2. ...

最新文章

  1. 桌面笔记工具KeepNote
  2. 原型模式(ProtoType) - Java里的对象复制
  3. BUG总结—Navicat连接Mysql8.0.11出现1251错误
  4. BUUCTF--练习场-- basic--上传文件漏洞经典靶场upload-labs-- Pass1-3(Pass4简单尝试)
  5. MIT Scheme 使用 Edwin
  6. 对MariaDB10.0的Sphinx进行扩展
  7. linux运维、架构之路-HAProxy反向代理
  8. 2020中国数字营销人才发展报告
  9. 腾讯副总裁程武取代吴文辉接管阅文集团 后者开盘涨近4%
  10. Ubuntu下安装rknn-toolkit以及转换darknet-yolov3模型
  11. 数据库零碎要点001_数据库的4大特性(原子性_持久性_隔离性_一致性)_数据库的隔离级别(脏读_幻读_不可重复读)_mysql如何设置隔离级别
  12. JavaScript parseInt() toString()函数
  13. 《Lua程序设计》第7章 迭代器与泛型for 学习笔记
  14. Ubuntu 安装 gcc 过程
  15. 零基础CSS入门教程(26)–CSS按钮实例
  16. BURP安装Turbo Intruder插件报错问题
  17. ODBC连接达梦数据库配置
  18. python 方差_python 方差_python 方差齐性检验_方差 python - 云+社区 - 腾讯云
  19. 同为iOS开发者为什么有人4k有人40k?原因就在这里!
  20. 在Windows和macOS上更新Node.js到最新版本

热门文章

  1. 如何参加活动拿到华为实践证书?一起来吧~
  2. android 手机 用短信发pdf文件,安卓手机什么pdf阅读器最好用?如何编辑pdf文件
  3. HVV就绪!你还在围观考虑吗?
  4. “先行者”半音阶口琴开箱照
  5. word怎么在下一页添加表头_简单!用2个小妙招,让Word跨页表格自动加表头!
  6. OTT与IPTV区别
  7. 用python做股票智能投顾模型_如何用Python建模GGM模型并对股票估值?
  8. 如何打开安卓手机的开发者模式/开发者选项,进行安卓开发真机调试
  9. 泰勒一维阵列天线matlab
  10. 睿码主数据管理平台到底有啥不一样