FFMPEG 关于smaple_fmts的理解及ffplay播放PCM

news2024/11/15 1:58:43

 问题

当我将一个aac的音频文件解码为原始的PCM数据后,使用ffplay播放测试是否成功时,需要提供给ffplay 采样率,通道数,PCM的格式类型 3个参数,否则无法播放!

所以使用ffprobe 查看原来的aac文件信息,这里我们可以看到采样率为 44100Hz, 通道为stereo表示双通道,后面跟着一个 fltp,这是个什么格式呢?

我们先看一下ffmpeg支持那些PCM格式,使用下面的命名查看

ffmpeg -formats | findstr PCM

可以看到PCM的格式还是很多,具体我们选择哪一种呢?总不能一个个的试吧! 

le --- 小端模式   be --- 大端模式  

答案

答案就在ffmpeg源码中,首先我们看下关于采样格式的定义,它定义在FFmpeg/libavutil/samplefmt.h文件中。根据位深度,是否有符号,打包类型,定义了12种类型,AV_SAMPLE_FMT_NONE表示未知类型,最后的AV_SAMPLE_FMT_NB表示样本格式个数为12个。

enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float
    AV_SAMPLE_FMT_DBL,         ///< double

    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar
    AV_SAMPLE_FMT_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar

    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
};

而我们在命令行看到是fltp跟它有什么关系呢?具体对照表如下,定义在FFmpeg/libavutil/samplefmt.c文件中

typedef struct SampleFmtInfo {
    char name[8];
    int bits;
    int planar;
    enum AVSampleFormat altform; ///< planar<->packed alternative form
} SampleFmtInfo;

/** this table gives more information about formats */
static const SampleFmtInfo sample_fmt_info[AV_SAMPLE_FMT_NB] = {
    [AV_SAMPLE_FMT_U8]   = { .name =   "u8", .bits =  8, .planar = 0, .altform = AV_SAMPLE_FMT_U8P  },
    [AV_SAMPLE_FMT_S16]  = { .name =  "s16", .bits = 16, .planar = 0, .altform = AV_SAMPLE_FMT_S16P },
    [AV_SAMPLE_FMT_S32]  = { .name =  "s32", .bits = 32, .planar = 0, .altform = AV_SAMPLE_FMT_S32P },
    [AV_SAMPLE_FMT_S64]  = { .name =  "s64", .bits = 64, .planar = 0, .altform = AV_SAMPLE_FMT_S64P },
    [AV_SAMPLE_FMT_FLT]  = { .name =  "flt", .bits = 32, .planar = 0, .altform = AV_SAMPLE_FMT_FLTP },
    [AV_SAMPLE_FMT_DBL]  = { .name =  "dbl", .bits = 64, .planar = 0, .altform = AV_SAMPLE_FMT_DBLP },
    [AV_SAMPLE_FMT_U8P]  = { .name =  "u8p", .bits =  8, .planar = 1, .altform = AV_SAMPLE_FMT_U8   },
    [AV_SAMPLE_FMT_S16P] = { .name = "s16p", .bits = 16, .planar = 1, .altform = AV_SAMPLE_FMT_S16  },
    [AV_SAMPLE_FMT_S32P] = { .name = "s32p", .bits = 32, .planar = 1, .altform = AV_SAMPLE_FMT_S32  },
    [AV_SAMPLE_FMT_S64P] = { .name = "s64p", .bits = 64, .planar = 1, .altform = AV_SAMPLE_FMT_S64  },
    [AV_SAMPLE_FMT_FLTP] = { .name = "fltp", .bits = 32, .planar = 1, .altform = AV_SAMPLE_FMT_FLT  },
    [AV_SAMPLE_FMT_DBLP] = { .name = "dblp", .bits = 64, .planar = 1, .altform = AV_SAMPLE_FMT_DBL  },
};

这里我们看到fltp表示的格式是AV_SAMPLE_FMT_FLTP,位深32位,数据存储方式位planar,与之相反的packed格式为AV_SAMPLE_FMT_FLT。

好了我们已经知道fltp表示的是float 32位数据,我们再结合前面的PCM的格式数据,再根据我们的电脑的大小端类型知道,我们需要传递的参数是应该就是 f32le

好了,我们使用ffplay 播放试试看

ffplay -ar 44100 -ac 2 -f f32le -i audio.pcm

 结果如下,完美播放:

 备注

这里有一个planar,之前有一篇关于视频的采样格式的文章,这里我们需要注意的是音频样本的内存

存储方式。

planar  --- 每个音频通道(channel )一个平面,例如双通道data[0] = LLL..., data[1] = RRR...

                  linesize表示单个plane的buffer size(以字节为单位)

packed --- 不管几个音频通道都只是用一个平面,数据交错存储,data[0] = LRLRLR...

                  linesize表示单个plane的buffer size(以字节为单位)

其他

查看aac解码器信息

ffmpeg -h decoder=aac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python手写板 画图板 签名工具

程序示例精选 Python手写板 画图板 签名工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Python手写板 画图板 签名工具>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

别再回答面试官,toFixed采用的是四舍五入啦!

四舍五入大家都知道&#xff0c;但你知道银行家舍入法么&#xff1f;你知道JS里的toFixed实现用的是哪种吗&#xff1f; 前两天我写了篇《0.1 0.2 不等于 0.3&#xff1f;原来是因为这个》&#xff0c;大概就是说&#xff0c;0.1 0.2不等于0.3是因为浮点数精度问题。 结果在…

LinkedList 的特点及优缺点

现在来讲 LinkedList LinkedList 是链表集合&#xff0c;基于链表去存储数据&#xff0c;每一个数据视作一个节点 private static class Node<E> {// 存放的数据E item;// 下一个节点Node<E> next;// 上一个节点Node<E> prev;Node(Node<E> prev, E ele…

【unity实战】2D横版实现人物移动跳跃2——用对象池设计制作冲锋残影的效果(包含源码)

基于上一篇人物移动二段跳进一步优化完善 先看看最终效果 什么是对象池? 在Unity中,对象池是一种重复使用游戏对象的技术。使用对象池的好处是可以减少游戏对象的创建和销毁,从而提高游戏的性能。如果不使用对象池,每次需要创建游戏对象时,都需要调用Unity的Instantiate函…

国内几大技术网站,你最爱和哪个玩耍?

所谓“物以类聚&#xff0c;人以群分” 所谓“士为知己者死&#xff0c;女为悦己者容” 所谓“世上的乌鸦都一般黑&#xff0c;鸽子却各有各的白” CSDN&#xff0c;掘金&#xff0c;博客园等&#xff0c;说起来都是“技术”社区&#xff0c;每个却都有着不同的姿色和用处。至于…

初识Spring——IoC及DI详解

目录 一&#xff0c;什么是Spring Spring设计核心 Spring核心定义 Spring官网 二&#xff0c;什么是IoC IoC思想 控制权的反转 三&#xff0c;什么是DI DI的定义 DI和IoC的关系 一&#xff0c;什么是Spring Spring设计核心 我们常说的Spring其实指的是Spring Framewo…

ABP vNext电商项目落地实战(一)——项目搭建

一、落地条件&#xff1a; 1. .NET5版本 2. DDD 3. ABP vNext 4.ABP CLI &#xff08;ABP的命令行工具&#xff0c;包括ABP的各种模板&#xff09; 5.SQL Server 写在前面&#xff1a;我觉得这个框架的文件分层很凌乱&#xff0c;在企业的实际业务场景中&#xff0c;一般…

vscode+git浅尝

git 安装git以后初始化仓库分支重命名合并分支连接远程仓库推送项目 安装git以后 第一次使用git需要配置用户名和邮箱 任意处打开git终端&#xff0c;譬如鼠标右击点击git bash here 命令分别为&#xff1a; 设置用户名和邮箱 git config --global user.name “username” …

【QA】Python代码调试之解决Segmentation fault (core dumped)问题

Python代码调试之解决Segmentation fault 问题 问题描述排查过程1. 定位错误&#xff0c;2. 解决办法 参考资料 问题描述 Python3执行某一个程序时&#xff0c;报Segmentation fault (core dumped)错&#xff0c;且没有其他任何提示&#xff0c;无法查问题。 Segmentation fa…

jenkins gitlab asp.net core持续集成

什么是jenkins Jenkins直接取自其官方文档&#xff0c;是一个独立的开源自动化服务器&#xff0c;您可以使用它来自动执行与构建、测试、交付或部署软件相关的各种任务。 jenkins可以干什么 Jenkins 通过自动执行某些脚本来生成部署所需的文件来工作。这些脚本称为JenkinsFi…

叶酸聚乙二醇羟基FA-PEG-OH;了解高分子试剂 Folate-PEG-OH

FA-PEG-OH&#xff0c;叶酸-聚乙二醇-羟基 中文名称&#xff1a;叶酸聚乙二醇羟基 英文名称&#xff1a;FA-PEG-OH HO-PEG-FA Folate-PEG-OH 性状&#xff1a;黄色液体或固体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水&#xff0c;DMSO、DMF等常规性有机溶剂 活性基…

【NestJs】使用连接mysql企业级开发规范

本篇将介绍如何建立 NestJs 的数据库连接、并使用数据库联表查询。 简介 Nest 与数据库无关&#xff0c;允许您轻松地与任何 SQL 或 NoSQL 数据库集成。根据您的偏好&#xff0c;您有许多可用的选项。一般来说&#xff0c;将 Nest 连接到数据库只需为数据库加载一个适当的 No…

Delphi DataSnap 流程分析(一)

DataSnap 有三种方式: 1、DataSnap REST Application: Create a DataSnap Server with support for REST Communication and with pages that invoke server methods using Java Script and JSON. 2、DataSnap Server: The DataSnap Server Wizard provides an easy way to i…

怎么把视频中动态的人物P掉,把视频中不要的人物去掉

怎么把视频中动态的人物P掉&#xff1f;很多小伙伴试过ps抠图&#xff0c;但是你试过视频人物抠图吗&#xff1f;其实道理是一样的&#xff0c;但是操作过程却变难了。今天就给大家带来一个简单的方法&#xff0c;轻松去除视频中的人物。不影响整个画面的呈现。 在拍摄旅游视频…

springcloud:快速上手定时任务框架xxl-job(十五)

0. 引言 实际开发中&#xff0c;我们常常遇到需要定时执行的任务&#xff0c;我们可以利用定时线程池或schedule框架等来实现定时任务&#xff0c;但这些方式都有效率、性能上的缺陷&#xff0c;在微服务框架下&#xff0c;我们期望一种更加规整、轻量、可靠的定时任务框架来帮…

【通信接口】UART、IIC、SPI

目录 一、预备知识 1、串行与并行 2、单工与双工 3、波特率 二、UART 三、IIC 四、SPI &#xff08;一对一、一对多&#xff09; 五、IIC、SPI异同点 参考文章&#xff1a;这些单片机接口&#xff0c;一定要熟悉&#xff1a;UART、I2C、SPI、TTL、RS232、RS422、RS485…

kafka-5 kafka的高吞吐量和高可用性

kafka的高吞吐量和高可用性 6.1 高吞吐量6.2 高可用&#xff08;HA&#xff09; 6.1 高吞吐量 kafka的高吞吐量主要是由4方面保证的&#xff1a; &#xff08;1&#xff09;顺序读写磁盘 Kafka是将消息持久化到本地磁盘中的&#xff0c;一般人会认为磁盘读写性能差&#xff…

【C++ 八】写文件、读文件

写文件、读文件 文章目录 写文件、读文件前言1 文本文件1.1 写文件1.2 读文件 2 二进制文件2.1 写文件2.2 读文件 前言 本文包含文本文件写文件、文本文件读文件、二进制写文件、二进制读文件。 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 通…

中间表示- 活性分析

进行活性分析的动机 &#xff08;1&#xff09;在代码生成的讨论中&#xff0c;我们曾假设目标机器有无限多个&#xff08;虚拟&#xff09;寄存器可用&#xff0c;这简化了代码生成的算法&#xff0c;但对物理机器是个坏消息&#xff0c;因为机器只有有限多个寄存器&#xff…

Spring Boot 应用的打包和发布

1. 创建项目&#xff08;example-fast&#xff09; 基于 Spring Boot 创建一个 WEB 项目 example-fast。 2. 编译打包 2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包&#xff0c;可谓是超级 easy 2.2 mvn 命令打包 # mvn clean 清理编译 # install 打包 #…