ffmpeg解析pcm文件进行播放

初始化音频子系统是使用 SDL 播放音频之前的一个必要步骤。这确保了 SDL 能够正确地配置和使用音频硬件。如果你不进行初始化,试图使用音频功能可能会导致未定义的行为或错误。

为什么需要初始化音频子系统?
1.资源分配:
SDL 需要为音频设备分配资源,比如设置缓冲区大小、采样率等。
初始化确保 SDL 可以适当地配置音频设备。
2.设备兼容性:
不同的操作系统和硬件平台有不同的音频设备驱动程序。
初始化过程确保 SDL 使用正确的驱动程序与音频硬件通信。
3.状态设置:
初始化过程中可以设置音频输出的基本参数,如通道数、采样率、格式等。
这些设置对于播放音频是必需的。
4.错误检测:
初始化时 SDL 会尝试检测并报告任何潜在的问题,如音频设备不可用或驱动程序错误。

//初始化Audio子系统if(SDL_Init(SDL_INIT_AUDIO)){qDebug() << "SDL_Init error" << SDL_GetError();return;}
#include "playthread.h"
#include <SDL2/SDL.h>
#include <QDebug>
#include <QFile>#define FILENAME "D:/ffmpeg/ffm.pcm"
#define SAMPLE_RATE 44100
#define SAMPLE_FORMAT AUDIO_S16LSB
#define SAMPLE_SIZE (SAMPLE_FORMAT & 0xFF)//== SDL_AUDIO_BITSIZE() = 16;
#define CHANNELS 2//缓冲区样本数量
#define SAMPLES 1024
//每个样本占用多少字节
#define BYTES_PER_SAMPLE ((SAMPLE_SIZE * CHANNELS)/8) // 4
//文件缓冲区大小
#define BUFFER_SIZE BYTES_PER_SAMPLE * SAMPLES//4096typedef struct
{int len = 0;int pullLen = 0;char* data = nullptr;
}AudioBuffer;
//音频参数SDL_AudioSpec spec;//采样率spec.freq = SAMPLE_RATE;//采集格式(s16le)spec.format = AUDIO_S16LSB;//小端读取//声道数spec.channels = CHANNELS;//音频缓冲区的样本数量(这个值必须是2的幂)spec.samples = 1024;//回调spec.callback = pull_audio_data;//传递给回调函数的参数AudioBuffer buffer;spec.userdata = &buffer;//打开设备if(SDL_OpenAudio(&spec,nullptr)){qDebug() << "SDL 0penAudio error" << SDL_GetError();//清楚所有子系统SDL_Quit();return;}//打开文件QFile file(FILENAME);if(!(file.open(QFile::ReadOnly))){qDebug() << "file open error" << FILENAME;//关闭设备SDL_CloseAudio();//清除所有子系统SDL_Quit();return;}//开始播放(0是取消暂停) -- 开始后会一直调用回调函数SDL_PauseAudio(0);//存放从文件中读取的数据char data[BUFFER_SIZE];while(!isInterruptionRequested()){//只要从文件中读取的音频数据,还没有填充完毕,就跳过if(buffer.len > 0) continue;buffer.len = file.read(data,BUFFER_SIZE);if(buffer.len <= 0){//剩余的样本数量int samples = buffer.pullLen / BYTES_PER_SAMPLE;int ms = samples * 1000 / SAMPLE_RATE;qDebug() << ms;break;}//读取到了文件数据buffer.data = data;}//关闭文件file.close();//关闭设备SDL_CloseAudio();//清除所有子系统SDL_Quit();

当进行传参并进行设置回调函数后,线程就会不停歇的进行调用回调函数,知道线程结束

//等待音视频设备回调(会回调多次)
void pull_audio_data(void *userdata,//需要往stream中填充PCM数据Uint8 *stream,//希望填充的大小(samples *format *channels / 8)int len)
{//清空streamSDL_memset(stream,0,len);AudioBuffer* buffer = (AudioBuffer*)userdata;//如果bufferLen的长度为0说明还没有准备好if(buffer->len <= 0) return;//取len、bufferLen的最小值(防止指针越界)buffer->pullLen = (len > buffer->len) ? buffer->len : len;//填充数据进行播放SDL_MixAudio(stream,(Uint8*)buffer->data,buffer->pullLen,SDL_MIX_MAXVOLUME);buffer->data += buffer->pullLen;buffer->len -= buffer->pullLen;
}

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

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

相关文章

06-用户画像 + es映射+写入数据

es映射 创建用映射表 外部表删除时不会删除行数据&#xff0c;只删除元数据 内部表数据会全部删除 一下创建的是外部表 -- 创建映射表&#xff0c;指向es create external table db_ods.es_users(id int,username string,gender string )stored by org.elasticsearch.hadoop.h…

26.8 Django多表操作

1. 表关系 表关系在数据库中指的是表与表之间的连接和依赖关系. 这种关系定义了数据如何在不同的表之间进行交互和关联, 是实现数据一致性和完整性的重要手段.1.1 关系分类 多表关系在数据库中通常分为以下几种类型: * 1. 一对一(One-to-One)关系: 在数据库中, 这种关系通常通…

模拟建造游戏:城市:天际线2(都市天际线2)中文免安装,解压即撸

《城市&#xff1a;天际线2》&#xff08;Cities: Skylines II&#xff09;是一款模拟经营游戏&#xff0c;由Colossal Order开发&#xff0c;Paradox Interactive发行。 下载地址&#xff1a;https://pan.quark.cn/s/84e69332ec3e 更多游戏&#xff1a;https://kdocs.cn/l/cuH…

spring 中的属性解析器 PropertyResolver

我们知道&#xff0c;在 spring 中可以使用占位符&#xff0c;格式如 "${}"&#xff0c;大括号中间放置待替换的占位符&#xff0c;待使用值时根据配置的属性解析器进行解析。但具体是如何操作的&#xff0c;且看本文来进行分析。 PropertyResolver 这是一个针对任…

基于Neo4j将知识图谱用于检索增强生成:Knowledge Graphs for RAG

Knowledge Graphs for RAG 本文是学习https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/这门课的学习笔记。 What you’ll learn in this course Knowledge graphs are used in development to structure complex data relationships, drive intelligent sea…

GDAL访问HDFS集群中的数据

1.集群搭建 参考文章&#xff1a;hadoop2.10.0完全分布式集群搭建 HA(QJM)高可用集群搭建_hadoop 2.10 ha-CSDN博客 创建文件夹 hdfs dfs -mkdir -p hdfs://192.168.80.132:9000/test 开放权限 hdfs dfs -chmod -R 777 /test 上传文件 hadoop fs -put /home/wh/data/res…

卡夫卡(Kafka)框架详解:从背景到应用实践

卡夫卡&#xff08;Kafka&#xff09;框架详解&#xff1a;从背景到应用实践 引言 在大数据和分布式系统日益普及的今天&#xff0c;数据处理和消息传递成为了支撑复杂业务系统的关键基础设施。Apache Kafka&#xff0c;作为一个高性能的分布式消息队列系统&#xff0c;因其高…

CSS技巧专栏:一日一例 11 -纯CSS实现多彩渐变按钮系列特效

CSS技巧专栏&#xff1a;一日一例 11 -纯CSS实现多彩渐变按钮系列特效 本篇&#xff0c;推荐给你几个按钮&#xff0c;先看一下图片 本例图片 案例分析 这是一个系列的按钮&#xff0c;它们具有共同的特点&#xff1a; 底层按钮层&#xff0c;具有一个彩色的渐变边框&#…

第十四章 数据库

第十四章 数据库 14.1 引言 数据存储在传统上是使用单独的没有关联的文件&#xff0c;称为平面文件 14.1.1 定义 定义&#xff1a;数据库是一个组织内被应用程序使用的逻辑相一致的相关数据的集合 14.1.2 数据库的优点 数据库的优点&#xff1a; 冗余少避免数据的不一致…

docker产生日志过大优化

1、Docker容器启动后日志存放位置 #cat /var/lib/docker/containers/容器ID/容器ID-json.log #echo >/var/lib/docker/containers/容器ID/容器ID-json.log临时清除日志 注&#xff1a;echo一个空进去&#xff0c;不需要重启容器&#xff0c;但如果你直接删除这个日志&…

【JavaEE】Bean的作用域和生命周期

一.Bean的作用域. 1.1 Bean的相关概念. 通过Spring IoC和DI的学习(不清楚的可以看的前面写过的总结,可以快速入门, http://t.csdnimg.cn/K8Xr0),我们知道了Spring是如何帮助我们管理对象的 通过 Controller , Service , Repository , Component , Configuration , Bean 来声明…

无人机之航拍高级操作与技巧

一、直线飞行与矩形飞行练习&#xff1a;通过直线和矩形路径的练习&#xff0c;提升飞行路径控制能力。 二、航点命令和事件编程&#xff1a;学习如何设置航点命令和事件&#xff0c;使无人机能够自动执行复杂任务。 三、故障诊断与处理&#xff1a;掌握基本的故障诊断方法和…

如何使用 API list 极狐GitLab 群组中的镜像仓库?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

深入指南:VitePress 如何自定义样式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Linux Shell——用awk计算相邻两行相减

如何用awk计算相邻两行相减 下面是将文件的第二列数据进行相邻两行相减的操作&#xff1a; awk NR1{tmp$2}NR>1{print $2-tmp;tmp$2} test.txt

2 Go语言的基础代码解析

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…

PHP安全编程宝典:30000字精细解析

文章目录 基础语法单双引号的区别前后端分离数据类型PHP常量函数var_dump函数count函数print_r函数**readfile&#xff08;&#xff09;函数****file_get_contents()函数****file_put_contents()函数**header函数fopen函数fread 函数rename函数copy&#xff08;&#xff09;函数…

【时时三省】(C语言基础)结构体

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 结构体 结构体使得C语言有能力描述复杂类型。 结构体可以让c语言创造新的类型出来 示例: struct Stu &#xff5b; char name&#xff3b;20&#xff3d; &#xff08;名字的话是一个字…

数学建模--简单优化模型之存储模型

目录 1.问题概述 1.1问题介绍 1.2优化目标 2.问题的分析与思考 2.1已知条件的说明 2.2正确的理解准备费 2.3三个举例 3.模型的假设 4.模型的建立与求解 4.1模型的建立 4.2模型的求解 5.灵敏度分析 6.模型推广 1.问题概述 1.1问题介绍 上面这个已经介绍了&#xff…

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示&#xff1a; 当记录条数过多时会自动出现滚轮&#xff0c;数据不会超出紫框 数据库实时记录&#xff1a; 项目源代码以及所用到的资源&#xff1a; 链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机App…