场景要求

项目要求点播速度是300到500毫秒之间,现在最长的点播延时是1300毫秒(有的时候甚至无法播放视频),生产环境是RTSP传输h264裸流数据,研究在接收到I帧的时候,开始出来图像,简化FFmpeg的调用逻辑(SPS/PPS已经预先知道,并且分辨率也是固定为1920*1080)

解决方案

1)指定SPS/PPS参数,方便在调用avcodec_open2函数打开×××的时候,找到正确的视频参数

https://blog.51cto.com/fengyuzaitu/2058138

2)通过指定视频码流格式H264减少探测时间

关键函数是:avformat_open_input和avformat_find_stream_info

https://blog.51cto.com/fengyuzaitu/1573766

https://blog.51cto.com/fengyuzaitu/1982996

3)核心是要求发送端发送的第一帧:强制I帧,根据如下的其他的方案指定码流的格式

4)用户新加入流媒体转发队列,流媒体推送用户的第一帧,不一定是I帧(这一帧之前的SPS/PPS不能少),用户需要等待一段时间才能看到画面,直到I帧的出现随着GOP的增大,时间可能更长。为了解决问题,需要缓存整一个GOP的图像序列,单纯保存I帧,没有效果,因为每一个P帧都会依赖之前的P帧,类似于后面的图片是前面图片效果的叠加。新增加的用户,先发送缓存的GOP序列,然后才发送剩下接收的数据

相关问题点有待研究

1)avformat_open_input取消问题的优化

在代码中指定如下:

AVInputFormat* pAVInputFormat = av_find_input_format("h264");

pAVFormatContext->iformat = pAVInputFormat;

//if (avformat_open_input(&pAVFormatContext, "", pAVInputFormat, NULL) < 0)

如果不调用avformat_open_input函数实际上,影响到的是av_read_frame(pVideo->m_pAVFormatContext, packet)

出错提示:

No start code is found

Error splitting the input into NAL units

实际上av_read_frame关键作用是从缓冲中拆分出一个个NAL单元(每一个NAL单元都是从00 00 00 01作为开始码,开始的),

目前的解决方案是手动自己进行NAL单元的拆分,然后送到av_send_packet进行分帧解码(从而也取消了

av_read_frame函数的调用),手动拆分出NAL,有点麻烦

正在研究的是avformat_open_input可能会填充pAVFormatContext的URLProtocol协议字段,不过这已经是FFmpeg底层函数,

可能不可访问,正在分析源码

2)non-existing PPS 0 referenced问题

在调用av_read_frame函数的时候,会提示如上错误

non-existing PPS 0 referenced

decode_slice_header error

no frame!

但是实际上,手动添加SPS/PPS的内容到extradata字符串中,

unsigned char sps_pps[] = { 0x00 ,0x00 ,0x01,0x67,0x42,0x00 ,0x2a ,0x96 ,0x35 ,0x40 ,0xf0 ,0x04 ,0x4f ,0xcb ,0x37 ,0x01 ,0x01 ,0x01 ,0x40 ,0x00 ,0x01 ,0xc2 ,0x00 ,0x00 ,0x57 ,0xe4 ,0x01 ,0x00 ,0x00 ,0x00 ,0x01 ,0x68 ,0xce ,0x3c ,0x80, 0x00 };

pAVFormatContext->streams[0]->codecpar->extradata_size = sizeof(sps_pps);

pAVFormatContext->streams[0]->codecpar->extradata = (uint8_t*)av_mallocz(pAVFormatContext->streams[0]->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);

memset(pAVFormatContext->streams[0]->codecpar->extradata, 0, sizeof(sps_pps) + FF_INPUT_BUFFER_PADDING_SIZE);

memcpy(pAVFormatContext->streams[0]->codecpar->extradata, sps_pps, sizeof(sps_pps));

FFmpeg需要通过分析数据来确定输入格式,所有程序启动时,ffmpeg收到的数据最先应该是SPS与PPS的nalu单元,然后是具体的视频数据

相关博客

https://blog.51cto.com/fengyuzaitu/2058138

https://blog.51cto.com/fengyuzaitu/2057885

3)如果知道了码流格式,实际上不需要调用什么探测码流格式的函数,直接调用AVCodecContext解码,就可以

目前在网上没有相关的资料

FFmpeg日志定向输出到文件

https://blog.51cto.com/fengyuzaitu/2053210

avcodec_send_packet函数错误定位

https://blog.51cto.com/fengyuzaitu/2046171

相关资料

1)http://www.yidianzixun.com/news_1eff46dc583b688d33a557b5582745dc

MP4的H264视频数据保存在名为mdata的box当中,MediaRecorder通过socket发送出来的MP4数据包含四部分:填充符、ftyp、mdat、slice。

其中slice就是我们要找的视频数据,slice是mdata的一部分,slice与mdata之间可能存在填充符,而slice与slice之间是连在一起的。

slice由视频数据长度(4字节,前两个字节通常为0)和视频数据组成,其中视频数据是不带起始码的H264 Nalu单元,

不难看出其第一个字节为0x65(关键帧)、0x41等。数据长度描述的是 H264 Nalu单元的长度,这样我们已经找到一帧完成的H264码流数据了,

接下来我们只需将 Nalu单元提取出来前面加上0x00 00 00 01的4字节起始码我们就得到了H264裸数据,这样的数据在播放器上还不能播放,

需在H264裸数据文件的最前端加上SPS与PPS信息(他们也是有起始码的哦),至此,播放器能够正常播放文件了

mediacodec延时_FFmpeg优化点播延时方案相关推荐

  1. 实现延时消息的6种方案

    延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费. 延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息的功能 ...

  2. 编码器NDI低延时无线WIFI室外直播方案(NDI传输+VMIX软导播)

    编码器NDI低延时无线WIFI室外直播方案(NDI传输+VMIX导播) 第一步,准备环境 第二步:配置`ENC1`编码器 **1.接通`ENC1`电源.网络** **2.登录设备** **3.连接信号 ...

  3. 是网络直播延时(1):起播延时及优化

    谁都知道清晰度.流畅度.延时是直播的几大关键指标,尤其是在互动直播.移动直播大行其道的当下,延时更是成为了各直播平台.CDN.直播云服务商比拼的至高点.然而,但是,BUT,你真的了解延时么?不能全面了 ...

  4. stm32延时us寄存器_STM32延时函数的四种方法

    关注.星标公众号,不错过精彩内容 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207介绍4种不同方式实现的延时函数. ...

  5. SystemML大规模机器学习,优化算子融合方案的研究

    SystemML大规模机器学习,优化算子融合方案的研究 摘要 许多大规模机器学习(ML)系统允许通过线性代数程序指定定制的ML算法,然后自动生成有效的执行计划.在这种情况下,优化的机会融合基本算子的熔 ...

  6. .NET-记一次架构优化实战与方案-梳理篇

    前言 程序员输出是他敲写的代码,那么输入就是他思考好的设计.因此不做设计是不存在,设计只分优秀的设计和糟糕的设计.为了避免过度设计浪费成本,需要针对现有业务与问题进行展开.业务梳理是不可避免的. 优化 ...

  7. .NET-记一次架构优化实战与方案-前端优化

    前言 上一篇<.NET-记一次架构优化实战与方案-梳理篇>整理了基本的业务知识,同时也罗列了存在的问题,本篇主要是针对任务列表的页面进行性能优化. 该篇主要涉及的是代码实现上的优化,实现上 ...

  8. 前端性能优化的重要方案:图片懒加载

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...

  9. 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-笔记篇

    需要结合:<百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇>一起学习 #百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量   #知识点 ''' 1 ...

最新文章

  1. 如何写出优雅的异常处理
  2. redis学习(九)——数据持久化
  3. ABAP,Java, nodejs和go语言的web server编程 1
  4. jdbc连接池连不上mysql80_JDBC MySql连接池实践可避免连接池耗尽-问答-阿里云开发者社区-阿里云...
  5. SAP License:SAP一个成功的案例之跳槽者必看
  6. 将运行时地理数据库(*.geodatabase)复制到文件地理数据库
  7. Topological Spaces(拓扑空间)
  8. python如何读取csv文件列表页_Python:使用列表列表读取CSV文件的字段
  9. 计算机科学与技术实践教学,浅谈计算机科学与技术实践教学体系
  10. WMS仓储管理系统解决方案
  11. 流水灯c语言单片机实验报告,实验一51单片机流水灯实验实验报告.doc
  12. FPGA编程语言--VHDL OR Verilog?
  13. linux如何撤销权限修改,linux 撤销权限
  14. 上海双非改考408,与上海计算所联合培养!上海第二工业大学计算机专硕!
  15. 腾讯与华中科技大学成立智能云存储技术联合研究中心
  16. Hadoop-Hive常用,命令
  17. 【运营宝典】华为分析服务如何助力广告投放策略优化?
  18. 湖西大学计算机专业排名,韩国留学热门的30个专业
  19. 朋友圈gys是什么意思,女生微信朋友圈说说经典句子
  20. vim制作python3编辑器

热门文章

  1. 开源如何走向商业化?
  2. 天干物燥,给你写BUG的心来点甘露
  3. 为何这名全栈工程师说“抛弃 React、Angular”?
  4. 登月源码登顶 GitHub Top1,37000 Star 致敬人类登月 50 周年!
  5. 突发!Java首度“落泪”,愿永久祝福Python!网友:我也想哭!
  6. Google 击败苹果!| 极客头条
  7. 这本 Kindle 排名第一的 Python 3 入门书,火遍了整个编程圈!| 码书
  8. 深入聊一聊 Spring AOP 实现机制!
  9. 中国首个!百度云宣布边缘计算开源,发布智能边缘开源平台OpenEdge
  10. 如何避免面试现场被虐?