admin管理员组

文章数量:1533916

粗略架构组成:

kotlin:

Kotlin 语言是由 JetBrains 公司开发,2010 面世,2017 年正式在谷歌 I/O 大会上推荐 Kotlin 作为 Android 开发语言。

FFmpeg:

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

SoundTouch:

可以在 PCM 音频裸流基础上对音频变调变速

OpenSLES:

OpenSL ES嵌入式系统的开放声音库)是一种免版税,跨平台,硬件加速的 C语言) 音频API,用于2D和3D音频。它提供对3D位置音频和MIDI播放等功能的访问。它是为移动和游戏行业的开发人员设计的,致力于使跨多个平台的应用程序轻松移植。

FFmpeg 初始化

编译 FFmpeg 可以参考我之前写的文章:音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2

这里我们就按照 FFmpeg 初始化流程来进行介绍 API 如下所示:

//1. 分配一个 AVFormatContext。
AVFormatContext *avformat_alloc_context(void);
//对应的释放
void avformat_free_context(AVFormatContext *s);

//2. 打开输入流,读取头部信息,一般包含有音频,视频流信息也可能有弹幕信息
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);
//对应的关闭流信息,释放所有内容资源
void avformat_close_input(AVFormatContext **s);

//3. 读取媒体文件的数据包以获取流信息。返回 >=0 则成功
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
//3.1 拿到当前流的数量信息,一般会有音频,视频,或者弹幕
int number = (*AVFormatContext)->nb_streams
//3.2 遍历拿到对应的 stream
//视频流
if ((*pFormatCtx)->streams && (*pFormatCtx)->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
//语音流
if ((*pFormatCtx)->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
//其它流类型
enum AVMediaType {
AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA
AVME

本文标签: 播放器音视频音频系列android