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

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

Spring Boot Actuator使用说明

《SpringBootActuator使用说明》SpringBootActuator是一个用于监控和管理SpringBoot应用程序的强大工具,通过引入依赖并配置,可以启用默认的监控接口,... 目录项目里引入下面这个依赖使用场景总结说明:本文介绍Spring Boot Actuator的使用,关于Spri

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate