Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)
项目地址,求star
https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E6%92%AD%E6%94%BE%E9%9F%B3%E4%B9%90%EF%BC%88%E4%BF%9D%E7%A8%8B%E5%BA%8F%E4%B8%8D%E6%AD%BB%EF%BC%89
这个是FFmpeg解码出音频,给AudioTrack播放,这回才算是java与c语言之间合作
这回我们将会从c++里调用java函数,下面就是关于c++使用AudioTrack的代码
private AudioTrack audioTrack;// 这个方法 是C进行调用 通道数public void createTrack(int sampleRateInHz,int nb_channals) {int channaleConfig;//通道数if (nb_channals == 1) {channaleConfig = AudioFormat.CHANNEL_OUT_MONO;} else if (nb_channals == 2) {channaleConfig = AudioFormat.CHANNEL_OUT_STEREO;}else {channaleConfig = AudioFormat.CHANNEL_OUT_MONO;}int buffersize=AudioTrack.getMinBufferSize(sampleRateInHz,channaleConfig, AudioFormat.ENCODING_PCM_16BIT);audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRateInHz,channaleConfig,AudioFormat.ENCODING_PCM_16BIT,buffersize,AudioTrack.MODE_STREAM);audioTrack.play();}//C传入音频数据public void playTrack(byte[] buffer, int lenth) {if (audioTrack != null && audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {audioTrack.write(buffer, 0, lenth);}}我们再来看看c++的代码
首先注册组件,然后得到音频流
获取解码器
//获取解码器上下文AVCodecContext *pCodecCtx=pFormatCtx->streams[audio_stream_idx]->codec;//获取解码器AVCodec *pCodex = avcodec_find_decoder(pCodecCtx->codec_id);//打开解码器if (avcodec_open2(pCodecCtx, pCodex, NULL)<0) {}
设置缓存区,保存解码前后的数据
设置解码出的声音一系列的属性,比如:单声道、双声道、采集点大小、采集率,还可以在这里对声音添加特效,
通过反射能够运行java函数
// 反射得到Class类型jclass david_player = env->GetObjectClass(instance); // 反射得到createAudio方法jmethodID createAudio = env->GetMethodID(david_player, "createTrack", "(II)V"); // 反射调用createAudioenv->CallVoidMethod(instance, createAudio, 44100, out_channer_nb);jmethodID audio_write = env->GetMethodID(david_player, "playTrack", "([BI)V");
在一边解码的时候一边给数据给AudioTrack播放
释放资源
av_frame_free(&frame);swr_free(&swrContext);avcodec_close(pCodecCtx);avformat_close_input(&pFormatCtx);env->ReleaseStringUTFChars(input_, input);
FFmpeg只是音视频处理的工具,他没有播放视频和音频的能力,所以我们需要SurfaceView显示视频,AudioTrack播放声音,而且OpenGLES也能播放声音,这个后面说
下一次就是说如何将视频的声音给听换掉,也就是将音视频的解码和编码都来搞一次
转载于:https://www.cnblogs.com/jianpanwuzhe/p/8427415.html
总结
以上是生活随笔为你收集整理的Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【Spark篇】---Spark中Mas
- 下一篇: Android Studio 第六十一期