从nginx-rtmp中提取一帧h264帧
- 摘要:一为什么要提取h264帧? 因为我们经常需要从事实流中截取一些画面,用于变动的封面,安全,鉴黄等用处。二从nginx_rtmp中怎么提取一帧h264帧呢? 前面我们讲过如何提取sps和pps,这里只需要提取一个nalu,如果是I帧就手动把sps和pps添加到帧前面就可以了。三提取实现代码 可以参照前面sps和pps提取, 从ngx_rtmp_live_av(ngx_rtmp_session
- 一 为什么要提取h264帧?
因为我们经常需要从事实流中截取一些画面,用于变动的封面,安全,鉴黄等用处。
二 从nginx_rtmp中怎么提取一帧h264帧呢?
前面我们讲过如何提取sps和pps,这里只需要提取一个nalu,如果是I帧就手动把sps和pps添加到帧前面就可以了。
三 提取实现代码
可以参照前面sps和pps提取,
从ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
ngx_chain_t *in)函数入手
(1)首先我们合并ngx_chain_t *in 数据。
ngx_str_t tmp_str = {0};
tmp_str.data = (u_char*)ngx_palloc(s->connection->pool,MAX_TAG_SIZE);
if(tmp_str.data == NULL)
{
return NGX_ERROR;
}
ngx_chain_t *tmp_in = NULL;
int in_len = 0;
int parse_offset = 0;
for(tmp_in = in;tmp_in;tmp_in = tmp_in->next)
{
memcpy(tmp_str.data + in_len,tmp_in->buf->pos,(int)(tmp_in->buf->last - tmp_in->buf->pos));
in_len += (int)(tmp_in->buf->last - tmp_in->buf->pos);
}
tmp_str.len = in_len;
这里内存申请,统一用nginx自带的内存池,这样方便管理,当连接结束的时候,nginx会自动释放这个内存池。
s->connection->pool。
但是由于我们这个一个tag占用内存太多,因此最好是用一次申请完就释放掉,或者最好直接保存到会话中,一次申请,永久使用。
(2) 接下看看合并后的数据格式,
17 01 00 00 50 00 00 8E 72 65 88 82
这是开头的几个字节的数据,从数据看就比较直观了。这个直接是rtmp video message的内容,去掉了messgae头的。也就是对应的flv文件的
video tag的body。17 1 表示keyframe,7表示AVC 。接下来的字节01是 AVCPacketType,然后是3个字节的CompositionTime,
然后是4个字节的nalu数据的长度。后面接着的是nalu数据体
(3) 实现代码
int nalu_type = tmp_str.data[9]&;0x1f;
if(nalu_type != 5)
{
return NGX_ERROR;
}//先得到nalu type 这里我们只提取I帧,
parse_offset += 5;
int nalu_len = ntohl(*(unsigned int *)((char *)tmp_str.data + parse_offset));
//解析nalu数据长度
memcpy(nalu->data + nalu->len,s->mjpeg_info.sps.data,s->mjpeg_info.sps.len);
nalu->len += s->mjpeg_info.sps.len;//追加sps到帧前面
memcpy(nalu->data + nalu->len,s->mjpeg_info.pps.data,s->mjpeg_info.pps.len);
nalu->len += s->mjpeg_info.pps.len;//追加pps到帧前面
memcpy(nalu->data + nalu->len,nalu_head,4);
nalu->len += 4;//追加nalu 头到前面 0x00000001
memcpy(nalu->data + nalu->len,&;tmp_str.data[9],tmp_str.len - 9);
nalu->len += (tmp_str.len - 9);//加上刚解析出来的nalu数据体
注意:sps和pps也都是一种nalu。四 如何提取aac音频的这里就不详细描述了,与上面类似
更多开源流媒体技术,请关注我们的微信:EasyDarwin
从nginx-rtmp中提取一帧h264帧相关推荐
- 使用ffmpeg从mp4文件中提取视频流到h264文件中
注释: -i 2018.mp4: 是输入的MP4文件 -codec copy: 从mp4中拷贝 -bsf: h264_mp4toannexb: 从mp4拷贝到annexB封装 -f h264: 采用 ...
- 【Android音视频开发】【032】Android从RTMP流中提取H264和AAC数据进行播放
前篇 在上篇博客中,我们已经讲解过,如何从RTMP流中提取H264和AAC数据,并保存为FLV,AAC,H264等文件 这篇博客我们讲解,怎么通过Android多媒体框架播放这些数据 上篇博客的重点在 ...
- gstreamer读取USB摄像头H264帧并用rtmp推流
文章目录 gstreamer命令行实现rtmp推流 gstreamer代码实现rtmp推流 因为要在嵌入式端使用rtmp推流,目前我知道的有三种办法,ffmpeg.gstreamer.librtmp, ...
- wireshark提取视频数据之RTP包中提取H264和H265
wireshark提取视频数据之RTP包中提取H264和H265 文章目录 wireshark提取视频数据之RTP包中提取H264和H265 1 背景 2 提取前工作 3 H264视频从RTP包中提取 ...
- 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...
- [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
[流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163 .com 一.MP4格式基 ...
- 流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
源地址:http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html [流媒體]H264-MP4格式及在MP4文件中提取H264的S ...
- 【转载】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
[流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概 ...
- 服务器搭建和使用 ubuntu_Ubuntu中使用Nginx+rtmp搭建流媒体直播服务
一.背景 本篇文章是继上一篇文章<Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务>文章而写,在上一篇文章中我们搭建了一个点播服务器,在此基础上我们再搭建一个直播服务器, ...
最新文章
- 这样规范写代码,同事直呼“666”
- 微信小程序与uniapp中 px与rpx 相互转换
- [原创]软件产品的质量
- 系统练级攻略 | 京东架构师倾情解读
- DSP学习 -- C语言实现MySQL数据库操作
- 基于升序链表的定时器
- python创建一个有序链表_Python实现单向有序链表(Singly linked list)
- QT 图片与base64互转
- cad多段线画圆弧方向_cad画带角度的圆弧怎么画(cad多段线用角度画圆弧问题)...
- 少子寿命测试仪 硅片少子寿命测试系统美国Sinton WCT-120少子寿命测试仪
- 天天背单词--的设计与实现(四)
- 多层板的板层布局和线宽的设置(记录)
- mac更新系统后xcode-select --install使用问题
- 2022茶艺师(中级)考试题模拟考试题库及模拟考试
- MacbookPro使用小记
- 使用绝对定位来实现拉手网上的效果
- java file mac ox_MAC OX 配置JDK环境变量
- 仓库搬仓实施过程参考
- Java中文分词组件 - word分词(skycto JEEditor)
- linux下repo是什么文件夹,yum的repo文件详解、以及epel简介、yum源的更换
热门文章
- jquery.validation.js 使用
- 常用 API 函数(3): 文件处理函数
- NSUserDefaults数据保存使用
- Windows服务器安全设置经验详谈
- 洛谷 - P4014 分配问题(费用流/KM)
- 凸包模板(Graham算法)
- HYSBZ - 1026 windy数(数位dp)
- 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数举例:继承+组合(学习笔记:第7章 07)...
- 电脑卡顿不流畅怎么解决_如何解决因电脑内存容量不足引起的卡顿?
- 漫游Kafka设计篇之消息传输的事务定义