• 摘要:一为什么要提取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帧相关推荐

  1. 使用ffmpeg从mp4文件中提取视频流到h264文件中

    注释: -i 2018.mp4:  是输入的MP4文件 -codec copy: 从mp4中拷贝 -bsf: h264_mp4toannexb: 从mp4拷贝到annexB封装 -f h264: 采用 ...

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

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

  3. gstreamer读取USB摄像头H264帧并用rtmp推流

    文章目录 gstreamer命令行实现rtmp推流 gstreamer代码实现rtmp推流 因为要在嵌入式端使用rtmp推流,目前我知道的有三种办法,ffmpeg.gstreamer.librtmp, ...

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

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

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

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

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

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

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

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

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

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

  9. 服务器搭建和使用 ubuntu_Ubuntu中使用Nginx+rtmp搭建流媒体直播服务

    一.背景 本篇文章是继上一篇文章<Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务>文章而写,在上一篇文章中我们搭建了一个点播服务器,在此基础上我们再搭建一个直播服务器, ...

最新文章

  1. 这样规范写代码,同事直呼“666”
  2. 微信小程序与uniapp中 px与rpx 相互转换
  3. [原创]软件产品的质量
  4. 系统练级攻略 | 京东架构师倾情解读
  5. DSP学习 -- C语言实现MySQL数据库操作
  6. 基于升序链表的定时器
  7. python创建一个有序链表_Python实现单向有序链表(Singly linked list)
  8. QT 图片与base64互转
  9. cad多段线画圆弧方向_cad画带角度的圆弧怎么画(cad多段线用角度画圆弧问题)...
  10. 少子寿命测试仪 硅片少子寿命测试系统美国Sinton WCT-120少子寿命测试仪
  11. 天天背单词--的设计与实现(四)
  12. 多层板的板层布局和线宽的设置(记录)
  13. mac更新系统后xcode-select --install使用问题
  14. 2022茶艺师(中级)考试题模拟考试题库及模拟考试
  15. MacbookPro使用小记
  16. 使用绝对定位来实现拉手网上的效果
  17. java file mac ox_MAC OX 配置JDK环境变量
  18. 仓库搬仓实施过程参考
  19. Java中文分词组件 - word分词(skycto JEEditor)
  20. linux下repo是什么文件夹,yum的repo文件详解、以及epel简介、yum源的更换

热门文章

  1. jquery.validation.js 使用
  2. 常用 API 函数(3): 文件处理函数
  3. NSUserDefaults数据保存使用
  4. Windows服务器安全设置经验详谈
  5. 洛谷 - P4014 分配问题(费用流/KM)
  6. 凸包模板(Graham算法)
  7. HYSBZ - 1026 windy数(数位dp)
  8. 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数举例:继承+组合(学习笔记:第7章 07)...
  9. 电脑卡顿不流畅怎么解决_如何解决因电脑内存容量不足引起的卡顿?
  10. 漫游Kafka设计篇之消息传输的事务定义