ffmpeg关于读取av_read_frame音频数据时,AVPacket字段的说明

2024-04-27 16:48

本文主要是介绍ffmpeg关于读取av_read_frame音频数据时,AVPacket字段的说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用ffmpeg读取系统声音时,如下所示
av_read_frame(pFormatCtx_Audio, &packet) ;
packet中pts,dts,duration都是基于pFormatCtx_Audio里面对应AVStream的time_base。

下面我们看下AVStream里面的time_base是1000 0000,即1千万一秒。
在这里插入图片描述
然后我们读取一个packet,其值如下所示:
在这里插入图片描述
pts和dts都是1303426380000,这个值太大,我们先不管,我们看下duration字段,值100000,1千万的百分之一,所以读取到的这个音频包是10ms的长度。

我们再通过下面的语句对packet进行解码,解码器的time_base是48000(根据解码器的采样率进行设置)
ret = avcodec_send_packet(pReadCodecContext, &packet);
ret = avcodec_receive_frame(pReadCodecContext, pFrame);
我们观察下pFrame的值,如下:
在这里插入图片描述
可以看到转换成AVFrame结构后的样例数nb_samples为480,而解码器的time_base是48000,故AVFrame中的480个样例数刚好代表着10ms,与AVPacket中的duration能够对应上。
同时,我们可以看到,pts和dts相对于AVPacket没有发现变化,都是以AVStream的time_base为时间基。

我们接着取第二包数据,AVPacket的数据如下所示:
在这里插入图片描述
同样根据duration为100000,判断其为10ms。pts和dts的值为1303426480000,而第一包AVPacket的pts为1303426380000,两者相减,值刚好为100000,代表着10ms,即两个包间距为10ms。
接着用下面语句进行解码。
ret = avcodec_send_packet(pReadCodecContext, &packet);
ret = avcodec_receive_frame(pReadCodecContext, pFrame);
我们观察下pFrame的值,如下:
在这里插入图片描述
很明显,样例数还是480,这个是正常的,pts的值跟AVPacket的值一样。

我们接着取第三包数据,AVPacket的数据如下所示:
在这里插入图片描述
此时的duration为300000,代表着30ms,pts为1305752680000。与第二包的pts 1303426480000相减,并不是30ms的差值,这个跟我调试时,时间过去太长有关,导致系统对中间停顿的地方没有采集相关声音。
接着用下面语句进行解码。
ret = avcodec_send_packet(pReadCodecContext, &packet);
ret = avcodec_receive_frame(pReadCodecContext, pFrame);
我们观察下pFrame的值,如下:
在这里插入图片描述
可以看到nb_samples为1440,相对于采样率48000,刚好也代表着30ms。

这篇关于ffmpeg关于读取av_read_frame音频数据时,AVPacket字段的说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

智能BI(后端)-- 系统优化(安全性,数据存储,限流)

文章目录 安全性todo 数据存储限流限流的几种算法限流粒度限流的实现本地限流(单机限流)Redisson实现分布式限流(多机限流) 安全性 问题引入:如果用户上传一个超大的文件怎么办?比如1000G? 预防: 只要涉及到用户自主上传的操作,一定要校验文件(图像) 校验什么? 文件的大小文件的后缀文件的内容(成本高一点)文件的合规性,比如敏感内容(建议用第三方审核功能),t

StarRocks 跨集群数据迁移,SDM 帮你一键搞定!

作者:严祥光,StarRocks Active Contributor,StarRocks 存算分离核心研发,在社区中主要负责数据导入、跨集群同步、数据迁移和容灾等工作。 有时候,你可能会为以下需求而苦恼,苦苦搜索更好的解决方案: 情景一: 想象一下,你急需 验证新版本 , 但又不能影响线上已有集群的运行。你需要在不影响现有集群的基础上将数据迁移到新集群以进行验证。 情景二: 听说 S

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征:产业链条长、多业态并存 运营环境:数据交互和共享风险高 IT建设过程:数据复杂、历史包袱重 数据质量:数据可信和一致化的要求程度高 华为数字化转型与数据治理 华为数字化转型整体目标 华为数字化转型蓝图及对数据治理的要求 华为数据治理实践 华为数据治理历程 1. 第一阶

Android内核之Binder通信读操作:binder_thread_read用法实例(七十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行

Volley 请求后台数据中文乱码问题解决

Volley 请求后台数据中文乱码问题解决 Volley是Google家的网络框架,轻量简便,但是在使用过程中发现,部分接口存在中文乱码的问题,对,就是部分接口,而且经过检查发现获取的数据是iso-8859-1格式的(坑爹的试了很久),当时临时进行转换得到的。 java中字符串格式转换方法 resp = new String(result.getBytes("iso-8859-1"), "U

读取图像属性 动态加载图像

读取图像属性   1: <img src="/”image1.jpg"” name=”myImage”>   2: <a href=”# ” onClick=”window.alert(document.myImage.width)”>Width</a>   3:     动态加载图像   1: <script language=”JavaScript”>

在JS中操作JSON数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。  本文主要是对JS操作JSON的要领做下总结。     在JSON中,有两种结构:对象和数组。

vue3中通过数据字典实现下拉选择框的组件封装

1.下拉选择框组件文件 <template><el-select v-model="model" :placeholder :disabled :clearable style="width: 100%; min-width: 200px"><el-option v-for="item in dataList" :key="item[props.value]" :label="item[prop

FFmpeg的GPU功能进行视频处理

要使用FFmpeg的GPU功能进行视频处理,你需要确保已经安装了NVIDIA的GPU驱动、CUDA和cuDNN,并且你的FFmpeg版本已经支持GPU加速。以下是一个简化的步骤说明: 安装NVIDIA驱动、CUDA和cuDNN: 首先,你需要安装与你的NVIDIA GPU兼容的驱动。 接着,安装CUDA,这是NVIDIA的并行计算平台和API模型,它允许开发者使用NVIDIA GPU进行通用计

webpack打包踩坑之TypeError: Cannot read property 'bindings' of null

file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/loaders/babel-loader/  webpack-dev-server介绍:https://www.webpackjs.com/configuration/dev-server/  ,h