工作小记 ffmpeg avcodec_receive_frame 缓存问题

2023-11-01 05:20

本文主要是介绍工作小记 ffmpeg avcodec_receive_frame 缓存问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的流媒体项目中,在拉车辆流的过程中,发现调用ffmpeg avcodec_send_packetavcodec_receive_frame 时总是不能做到送入1包,立刻吐出对应pts的一帧,总是有缓存2-3帧的问题。对于普通的播放器已经足够,但是平行驾驶要求的极低延时就无法做到了。因为传输的h264流完全是只有IP帧,并没有依赖后向的B帧。所以开始调查问题解决办法。
1 首先尝试一些低延时参数,无效

AVDictionary *avdic=NULL;
av_dict_set(&avdic, "rtsp_transport", "tcp", 1);
av_dict_set(&avdic, "muxdelay", "0", 0);
av_dict_set(&avdic, "fflags", "nobuffer", 0);
av_dict_set(&avdic, "tune", "zerolatency", 0);
av_dict_set(&avdic, "max_delay", "0", 0);
av_dict_set(&avdic, "preset", "superfast", 0);
av_dict_set(&avdic, "packet-buffering", "0", 0);

2 查看官网发现有送入flush包的说法,用于刷新解码器,但是只是用于seek操作
https://ffmpeg.org/doxygen/4.0/group__lavc__encdec.html
3 开始dump ffmepg和webrtc两端的流,终于发现端倪
dump类工具

#include <fstream>class H264Dump
{
public://static H264Dump &Instance();H264Dump();~H264Dump();//void inputFrame(const H264Frame::Ptr &frame);void inputPkt(const char* data, int size);static int i;std::ofstream out;// std::mutex frame_list_mutex;// std::list<std::string> frame_list;
};int H264Dump::i = 0;
H264Dump::H264Dump()
{std::string _ = "player_11_5_" + std::to_string(++H264Dump::i) + ".h264";out = std::ofstream( _ , std::ios_base::out | std::ios::trunc | std::ios::binary);
}
H264Dump::~H264Dump()
{out.close();
}void H264Dump::inputPkt(const char* data, int size)
{out.write(data, size);out.flush();
}_ffmpeg_dump_h264.inputPkt((char*)packet->data, packet->size);

相同的文件,webrtc在收端,接到的流和原文件有一些小小的差异。在每个I帧(5)pps帧(8)之前,即**sps帧(7)**有一些不同,影响到了解码器能否立刻输出的情况!
在这里插入图片描述
H264码流中SPS PPS详解
vui参数的提问
H264裸流分析中,能获取哪些信息?
BSAnalyzer工具分析dump下的流
在这里插入图片描述
可以看到主要的不同就是在于num_reorder_framesmax_dec_frame_buffering的设置,webrtc是01,而我们的是22对于IPPP这种时不要缓存或者重排的,修改编码器后,果然解决了。
能正常拉到的流不一定就没问题,要仔细分析sps,pps等参数!

framerate=(time_scale/num_unit_in_tick)/2;
(pic_width_in_mbs_minus1+1 )*16 = 宽
(pic_height_in_map_units_minus1+1)*16 = 高

这篇关于工作小记 ffmpeg avcodec_receive_frame 缓存问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320762

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N