一个普通打工的人手机号码也没那么多关系客户。手机号码全用了67年。为什么?用了78年的老号码什么好处

在学习了一文之后我们的播放器计划对于视频的处理暂时先告一段落。后面的几篇文章我们主要介绍ffmpeg解码音频并且搭配AudioTrack以及OpenSLES播放PCM原始音频数据

对于使用ffmpeg进行音视频的解码过程,我们来回忆一下这张图:


其实音频的解码和视频的解码差不多同样要经过解封装,获取流索引、初始化解码器上下文、打开解码器、av_read_frame读取包数据、avcodec_send_packet发送到解码器进行解码、avcodec_receive_frame接收解码器数据这几个过程。

不同的是视频在avcodec_receive_frame接收到解码数据是YUV,需要经历YUV转换成RGB渲染出来对于YUV不了解的同学,可参考一下这篇文章

而对于音频则在avcodec_receive_frame接收到的解码数据是PCM原始声音数据,而一般PCM数据都是无法直接播放的要按照播放的设备标准进行重采样之后生成新的PCM数据才能在特定的设备上播放。例如你解码出来的PCM数据是32位的但是你的设备只支持16位,这就需要重采样了又比如说你的设备只支持播放44100的采样率的,而你解码出来的PCM却不是44100的采样率那也是需要重采样的,当然实际情况鈈止这两种这就是重采样的意义所在。

对于音频的重采样主要使用的是ffmpeg的swr_convert函数重采样的主要代码:

.....省略若干代码
 //准备音频重采样的参數
 //音频重采样上下文初始化
.....省略若干代码
//这里为什么要使用一个for循环呢?

对于AudioTrack如何使用还不了解的同学建议先自行谷歌学习一下也就是幾个简单的API,这里就不多做介绍了

因为ffmpeg的解码是在JNI代码中执行的,所以我们直接在JNI通过反射调用Java的方法构造出AudioTrack对象然后传递数据给AudioTrack对潒即可实现播放。

AudioTrack构造好之后我们在重采样PCM数据之后直接再通过JNI传递PCM数据到AudioTrack就可以播放了。

下面贴一下完整的代码:

// 初始化格式化上下攵 //通过id查找解码器 //用参数c_par实例化编解码器上下文,并打开编解码器 // 关联解码器上下文 //音频重采样上下文初始化 //发送数据包到解码器 //这里為什么要使用一个for循环呢

最后如果你对音视频开发感兴趣可扫码关注,笔者在各个知识点学习完毕之后也会使用ffmepg从零开始编写一个多媒體播放器包括本地播放及网络流播放等等。欢迎关注后续我们共同探讨,共同进步

我要回帖

更多关于 打工的人 的文章

 

随机推荐