Android-音视频学习系列-(十)基于-FFmpeg-+-OpenSLES-实现音频万能播放器

本文介绍了如何在Android上使用FFmpeg进行音频读取和解码,并结合OpenSLES实现音频播放。详细讲解了从格式读取、解码到重采样、再到OpenSLES的渲染过程,以及如何实现声道选择、音量控制和语调语速设置等功能。
摘要由CSDN通过智能技术生成

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
AVMEDIA_TYPE_VIDEO,
AVMEDIA_TYPE_AUDIO,
AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous
AVMEDIA_TYPE_SUBTITLE,
AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse
AVMEDIA_TYPE_NB
};

//4. 根据 AVCodecID 拿到已经注册的解码器
AVCodec *avcodec_find_decoder(enum AVCodecID id);

//5. 分配一个 AVCodecContext
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
//对应的释放
void avcodec_free_context(AVCodecContext **avctx);

//6. 给解码器设置参数
int avcodec_parameters_to_context(AVCodecContext *codec,
const AVCodecParameters *par);

//7. 打开解码器 is 0 success
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);

以上 7 步如果没有问题证明编解码器打开成功,可以进行下一步操作。

FFmpeg 读取音频帧

这里还是介绍 API 使用:

//1. 分配一个 AVPacket
AVPacket *av_packet_alloc(void);
//结果必须释放
void av_packet_free(AVPacket **pkt);

//2. 读取待解码数据包
int av_read_frame(AVFormatContext *s, AVPacket *pkt);

对,就是这么简单,就调用 3 个 API 然后循环读取,送入待解码队列中。

FFmpeg 解码音频为 PCM

这里相当于是读取待解码队列中的数据,进行解码为 PCM 数据

//1. 将待解码数据 AVPacket 送入解码器 0 is ok
int avcodec_send_packet(AVCodecContext *avctx, cons

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值