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
- 下一篇: NEO智能合约开发(一)不可能完成的任务