首页
学习
活动
专区
圈层
工具
发布
44 篇文章
1
[PyUserInput]模拟鼠标和键盘模拟
2
银行排队模拟(离散事件模拟)
3
Linux网络模拟
4
Linux TC(Traffic Control)作为损伤仪的基础配置和使用
5
深入学习Docker网络(看这篇就完全够了)
6
【鸿蒙 HarmonyOS】鸿蒙手机模拟器 ( 鸿蒙远程模拟器 | 鸿蒙远程模拟器运行手机应用 )
7
探索嵌入式应用框架(EAF)
8
多 OS 混合部署框架
9
嵌入式系统架构浅谈:编程设计模式 (一)---访问硬件的设计模式
10
事件驱动和消息驱动
11
原来 8 张图,就能学废 Reactor 和 Proactor
12
Linux df -h 命令hang住没有反应
13
kafka消费组信息采集异常(hang住)排查
14
ext4 io hung模拟脚本
15
解决 umount 命令卸载磁盘时busy/卡死的问题
16
程序卡死在void HardFault_Handler的解决办法
17
执行sed命令卡死CPU消耗100%一例分析
18
记一次因Redis使用不当导致应用卡死过程
19
字节对齐不慎引发的挂死问题
20
解引用NULL为什么会导致程序挂死?
21
记64位地址截断引发的挂死问题
22
websocket 在线工具_websocket添加请求头
23
【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
24
详解Handler机制中消息队列的出队逻辑
25
Android UpdateEngine模块流程(含序列图)
26
物联网时代的嵌入式开发平台
27
400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
28
ESP32芯片IO解读
29
M5Stack在ubuntu上进行开发编译
30
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
31
H264,你不知道的小技巧
32
linux 创建虚拟块设备,制作文件系统并挂载,用于测试lustre
33
基于linux开发uvc摄像头_uvc协议扩展
34
清晰讲解LSB、MSB和大小端模式及网络字节序
35
在树莓派中使用 MicroPython 接入 MQTT
36
MicroPython 玩转硬件系列1:环境搭建
37
嵌入式系统架构浅谈:编程设计模式 (二)---嵌入并发和资源管理的设计模式
38
嵌入式软件架构设计之分层设计
39
IC之路(一)Proteus-Arduino仿真环境搭建
40
图像处理基础(六)-libjpeg常用算法
41
OpenCV双目标定
42
L-K光流推导及OpenCV代码实现
43
NDI Webcam Input工具,那些你不知道的知识!
44
使用QEMU chroot进行固件本地调试
清单首页其它文章详情

H264,你不知道的小技巧

学习小技巧之前,我们先来了解一下什么是H264?

先来看一个问题,为什么要编码呢?

对于720P分辨率,深度为8的一幅图片的数据量为:1280*720*8(位),如果视频帧率为15,那一秒钟的数据量为:

1280*720*8*15/8/1024/1024 = 13.18MB

这对于用户而言,无疑是无法接受的。所以我们需要进行视频压缩,在更低比特率的情况下,依然可以提供清晰的视频。

H264即是这样一种高压缩高质量的视频压缩标准,其核心算法是帧内压缩与帧间压缩。

常见的帧类型有I帧、P帧和B帧:

I帧:帧内压缩,可以通过视频解压算法解压成一张完整的图片,它是一帧画面的完整保留,也被成为关键帧,一般在检测到丢包时,我们会立即向对方强求一个I帧。

P帧:帧间压缩,前向预测编码帧,其表示的是这一帧与前一帧的差别,即预测差值与运动矢量。

B帧:双向预测编码帧,记录的是本帧与前后帧的差别,其压缩率较高,但是解码对性能要求较高,一般不使用。

H264码流是由一个个的NALU组成。其具体的格式,以及其封包方式,例如单一NAL单元模式、组合封包模式和分片模式,我们这里不做具体的介绍,毕竟格式的死的,比较容易理解,网上的资料也比较多,此外借助Wireshark,可以直观的看到其各个字段的含义。举例如下:

其中:

FU-A,表示这是一个分片的单元;Start bit为1表示为起始片;Nal_unit_type为1表示非IDR的片;P slice告诉我们这是一个P帧的片,非常直观。

如果Wireshark Protocol只显示UDP怎么办?

答:右键,选择解码为,选择RTP

此时如果只显示RTP而不是H264呢?

答:依次选择编解-首选项-Protocol-H264,修改PT值即可。

接下来介绍一些小技巧吧!

Wireshark虽然提供各个字段的解析,但是我们无法直观的看到视频内容。接下来分享一个实用的小技巧。

首先下载rtp_h264_extractor.lua脚本https://github.com/volvet/h264extractor ,并放至Wireshark安装目录下;

修改init.lua,在最后增加dofile(DATA_DIR.."rtp_h264_extractor.lua"),同时确保enable_lua为true,或者disable_lua为false;

接下来我们就可以过滤需要分析的H264包,同时保证Protocol显示为H264,这里要注意包一定要过滤干净,保证没有其他通话的包干扰,过滤方法可以使用udp端口过滤例如udp.srcport==1000 && udp.dstport==2000 ,或者依次选择电话-RTP-RTP流,然后选中需要过滤的包,点击准备过滤器即可,见下图:

点击tools下的"Extract h264 stream from RTP"菜单项,在原包路径下会生成dump.h264;

此时VLC等播放软件便可以直接播放码流文件了,在遇到问题帧时,VLC往往会直接退出,那该如何分析呢?

推荐几款不错的分析软件,H264Visa、Elecard StreamEye Tools部分截图如下所示:

以上几款软件均可以对每一帧画面进行详细具体的查看,感兴趣的读者可以下载后对各个窗口以及工具进一步的查看或使用。

除此之外我们有自己的mod_pcap模块并已经集成到我们自己的FreeSWITCH版本中,可以将pcap包中H264数据转为yuv文件,以及提供play_pcap的APP,方便在工作中对H264数据进行的直观的查看,抓包、过滤、拨号,你就能看到包中的视频画面了。

下一篇
举报
领券