当前位置: 首页 > news >正文

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十四)

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)

解析

上篇文章,我们解析了 audiooutput 的一部分,我们接下来继续解析函数,Init,DeInit,fill_audio_pcm。

我们先看 Init

int AudioOutput::Init(){if(SDL_Init(SDL_INIT_AUDIO) != 0){return -1;}SDL_AudioSpec wanted_spec;SDL_AudioSpec spec;wanted_spec.channels = 2;wanted_spec.format = AUDIO_S16SYS;wanted_spec.silence = 0;wanted_spec.callback = fill_audio_pcm;wanted_spec.userdata = this;wanted_spec.samples = 1024;int ret = SDL_OpenAudio(&wanted_spec, nullptr);if(ret != 0){return -1;}dst_tgt.channels = wanted_spec.channels;dst_tgt.fmt = AV_SAMPLE_FMT_S16;dst_tgt.freq = wanted_spec.freq;dst_tgt.channel_layout = av_get_default_channel_layout(2);dst_tgt.frame_size = 1024;SDL_PauseAudio(0);
}

这个函数是负责初始化 SDL 播放音频。其中有三个函数比较重要,SDL_Init,SDL_OpenAudio,SDL_PauseAudio。

首先,SDL_Init(SDL_INIT_AUDIO)初始化 SDL 的音频部分。

接着,我们声明了两个 SDL_AudioSpec,这个包含音频输出格式的结构体

typedef struct SDL_AudioSpec
{int freq;                   /**< DSP frequency -- samples per second */SDL_AudioFormat format;     /**< Audio data format */Uint8 channels;             /**< Number of channels: 1 mono, 2 stereo */Uint8 silence;              /**< Audio buffer silence value (calculated) */Uint16 samples;             /**< Audio buffer size in samples (power of 2) */Uint16 padding;             /**< Necessary for some compile environments */Uint32 size;                /**< Audio buffer size in bytes (calculated) */SDL_AudioCallback callback;void *userdata;
} SDL_AudioSpec;

然后,我们将 wanted_spec 的各项参数进行赋值。

接着,我们通过 SDL_OpenAudio,打开音频设备。

然后,我们给 AVParams 的一个变量 dst_tgt 赋值。

最后,SDL_PuaseAudio,这是负责恢复或者暂停音频的函数,我们在其中传入的参数为 0,恢复音频。

好了,今天就先到这里,明天讲的函数很重要,因为比较多而且设计的音频数据的播放。

欲知后事如何,请听下回分解。

http://www.lryc.cn/news/235944.html

相关文章:

  • Tomcat无法映射到activiti-app导致activiti无法启动页面
  • c语言常见的面试问题
  • image图片之间的间隙消除
  • asp.net心理健康管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目
  • CnosDB有主复制演进历程
  • 【前沿学习】美国零信任架构发展现状与趋势研究
  • Toolformer论文阅读笔记(简略版)
  • Pytorch torch.dot、torch.mv、torch.mm、torch.norm的用法详解
  • Jave 定时任务:使用Timer类执行定时任务为何会发生任务阻塞?如何解决?
  • Visual Studio Code配置c/c++环境
  • 漏洞利用工具的编写
  • ChatGPT之父被OpenAI解雇
  • linux中利用fork复制进程,printf隐藏的缓冲区,写时拷贝技术,进程的逻辑地址与物理地址
  • java游戏制作-拼图游戏
  • 使用sklearn报AttributeError: ‘NoneType‘ object has no attribute ‘split‘
  • C++学习 --map
  • 基于Qt QList和QMap容器类示例
  • Flask学习一:概述
  • LeetCode:689. 三个无重叠子数组的最大和(dp C++)
  • Leetcode—206.反转链表【简单】
  • Linux - 内存 - 预留内存占用分析
  • Java学习之路 —— Java高级
  • git使用及常用命令
  • vue 学习 -- day36(分析工程结构)
  • SQL Injection
  • 【Go入门】 Go搭建一个Web服务器
  • VS 将 localhost访问改为ip访问
  • app使用
  • 【迅搜01】安装运行并测试XunSearch
  • Mac电脑VSCode配置PHP开发环境