相关

问题

编解码h264流时,会发现末尾丢帧。以ffmpeg为例,调用如下接口

int avcodec_encode_video2 ( AVCodecContext * avctx, AVPacket * avpkt, const AVFrame * frame, int * got_packet_ptr )

Encode a frame of video.

Takes input raw video data from frame and writes the next output packet, if available, to avpkt. The output packet does not necessarily contain data for the most recent frame, as encoders can delay and reorder input frames internally as needed.

int avcodec_decode_video2 ( AVCodecContext * avctx, AVFrame * picture, int * got_picture_ptr, const AVPacket * avpkt )

Decode the video frame of size avpkt->size from avpkt->data into picture.

Some decoders may support multiple frames in a single AVPacket, such decoders would then just decode the first frame.

官网api的提到:

Takes input raw video data from frame and writes the next output packet, if available, to avpkt. The output packet does not necessarily contain data for the most recent frame, as encoders can delay and reorder input frames internally as needed.

原因:

拿编码来说,丢帧形式如下图:

这被称为编码延迟。延迟原因又分为两种,一是计算延迟,二是缓存延迟。

所以:

h->frames.i_delay =

param->i_sync_lookahead + // 前向考虑帧数

max ( param->i_bframe, // B帧数量

param->rc.i_lookahead) + // 码率控制前向考虑帧数

另外编码时,通过设置参数将编码和获取的帧间隔缩小到0,参考“zerolatency"的tune值中参数的设置。

解决

编码延迟就需要在编码所有yuv数据之后必须flush。

int vflush_encoder(AVFormatContext *fmt_ctx, unsigned int stream_index) { int ret = 0; int got_frame; AVPacket enc_pkt; if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities & CODEC_CAP_DELAY)) return 0; av_init_packet(&enc_pkt); while (IS_GOING) { enc_pkt.data = NULL; enc_pkt.size = 0; ret = avcodec_encode_video2(fmt_ctx->streams[stream_index]->codec, &enc_pkt, NULL, &got_frame); if (ret < 0) break; if (!got_frame) { ret = 0; break; } ret = av_write_frame(fmt_ctx, &enc_pkt); printf("Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n", enc_pkt.size); av_free_packet(&enc_pkt); if (ret < 0) break; } return ret; }

解码同理,在av_read_frame到没有avpacket可以读取之后,要继续调用avcodec_encode_video2,将视频末尾帧解码出来。

h264解码延迟优化_h264编解码末尾丢帧问题原因和解决相关推荐

  1. h264解码延迟优化_JEET Air Plus:延迟优化技术,让你游戏不掉线

    现在蓝牙耳机,真的可谓是人手必备了.应该是每个人都会拥有一个,无论是年纪大的,还是年轻人,都会选择蓝牙耳机.摆脱线的束缚.可是市面上的蓝牙耳机的种类还是过于繁多的,对于选择困难症的我来说,选择一款适合 ...

  2. 王学岗视频编码————视频编解码基础与MediaCodec编解码(对应1234节)

    为什么要学习音视频 核心竞争力,高端人才相当缺乏,技术迭代慢, 为什么音视频学不好 资料比较少,音视频最难的地方在于编码,没有形成完整的体系 关于音视频编码 上 1,视频文件:MP4,RMVB, AV ...

  3. 视频编解码:第一章 编解码基础

    1. 视频编码概念 视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式. 2. 为什么要进行视频压缩? 数据太大:未经压缩的数字视频数据量巨大 存储困难:一张DV ...

  4. 全志 android 硬解码,Adroid新增硬件编解码

    背景 瑞芯微和全志的平台 硬解的视频codec为H264 修改方法 1. 硬件编码 修改文件MediaCodecVideoEncoder.java (1)文件新增全志和瑞芯微的硬件编解码 //全志 p ...

  5. linux视音频解码教程,音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)

    音视频编解码:NVIDIA Jetson Linux Multimedia API(总结) 2020年12月02日 | 萬仟网IT编程 | 我要评论 一.官网链接官网链接:https://docs.n ...

  6. 解码base64_linux C++ Base64编解码

    Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或 ...

  7. python 编码解码原理_Python JSON编解码方式原理详解

    这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JSON(JavaScript Ob ...

  8. ubuntu下c++中base64编解码测试和图片编解码测试

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 字符数组的base64编解码 base64.h #include <string>std::string base64_encode(un ...

  9. zbar android解码错误,Android原生编解码接口 MediaCodec 之——踩坑

    关键帧 MediaCodec 有两种方式触发输出关键帧,一是由配置时设置的 KEY_FRAME_RATE和KEY_I_FRAME_INTERVAL参数自动触发,二是运行过程当中经过 setParame ...

  10. android电视盒子解码很慢,安卓电视/盒子很卡很慢原因及解决方法

    原标题:安卓电视/盒子很卡很慢原因及解决方法 安卓电视以及机顶盒跟手机一样,在使用时间久了就会出现一些卡顿的现象,今天小编帮大家总结了一些导致安卓电视.盒子卡顿的原因,并且根据这些原因提出解决的办法, ...

最新文章

  1. Linux内核中max()宏的奥妙何在?(一)
  2. PHP中间件--ICE
  3. Android 手游闪屏极简方案
  4. 并查集——关押罪犯(洛谷 P1525)
  5. 成功修复2G金士顿U盘
  6. 拥有PMP/ITIL/Prince2证书,你将享受这些国家福利
  7. 电脑键盘部分按键失灵_笔记本键盘部分失灵怎么办,笔记本个别键失灵的处理方法...
  8. R语言——(四)、数据读入与预处理
  9. Windows 7下Git SSH 创建Key的步骤(by 星空武哥)
  10. js下载Word文档
  11. 区块链的硬分叉、软分叉介绍
  12. ubuntu16.04修改DNS永久生效
  13. java赵云主角兵器谱游戏_赵云赵子龙的外号有哪些?赵云的武器是什么 赵
  14. 用自己拍的一张照片做海报
  15. 3D打印技术之切片引擎(7)
  16. “双指针”法解决链表问题
  17. 普里姆算法解决修路问题
  18. 无刷直流电机--参考博客
  19. 日期格式yyyy-MM-dd和YYYY-MM-dd有什么区别?
  20. HTML5开发手机项目-个人总结

热门文章

  1. 最新PHP搞笑文字表情包在线制作网站源码
  2. Shadowsocks错误:端口已被占用1090的错误解决办法
  3. echarts世界地图(含中国省份地图),中国省份下钻到县,点击按钮返回上一级
  4. 集成editormd支持markdown语法(二)之页面显示及回显
  5. Win10使用快捷键新建文件夹和.txt文本文档,提升工作效率,让你成为最靓的仔
  6. 软件开发人员培养计划
  7. kali攻击139端口_入侵445端口-永恒之蓝漏洞利用-Metasploit
  8. 视频教程-Dreamweaver初级从入门到精通,掌握网页制作-Dreamweaver
  9. 智能功放 ACS 保护
  10. VBA 下载图片到word