audio_mix-master
所属分类:其他
开发工具:Java
文件大小:186KB
下载次数:7
上传日期:2017-10-30 15:53:26
上 传 者:
xiaofei-felix
说明: 音频混合:实时录制audio时录制麦克风数据 和 写入背景音乐
本次案例实现了
*MediaPlayer 播放音频
*AudioTrack 播放音频 mp3 --> pcm data ( libs/jl1.0.1.jar )
*AudioRecord 录制音频 pcm file
*AudioTrack 播放音频 pcm data
*AudioRecord 录制音频 use MediaCodec & MediaMuxer write data
*MediaExtractor 和 MediaCodec 手动解码出 pcm 数据
*混合音频
(Audio mixing: recording microphone data and writing background music when recording audio in real time
This case has come true
* MediaPlayer broadcasts audio
* AudioTrack MP3 - > PCM data audio (libs/jl1.0.1.jar)
* AudioRecord recording audio PCM file
* AudioTrack broadcasts audio PCM data
* AudioRecord recording audio use MediaCodec & MediaMuxer write data
* MediaExtractor and MediaCodec manually decode the PCM data
Mix audio)
文件列表:
build.gradle (911, 2017-04-25)
libs (0, 2017-04-25)
libs\jl1.0.1.jar (105363, 2017-04-25)
src (0, 2017-04-25)
src\androidTest (0, 2017-04-25)
src\androidTest\java (0, 2017-04-25)
src\androidTest\java\com (0, 2017-04-25)
src\androidTest\java\com\cl (0, 2017-04-25)
src\androidTest\java\com\cl\slack (0, 2017-04-25)
src\androidTest\java\com\cl\slack\playaudio (0, 2017-04-25)
src\androidTest\java\com\cl\slack\playaudio\ExampleInstrumentedTest.java (748, 2017-04-25)
src\main (0, 2017-04-25)
src\main\AndroidManifest.xml (781, 2017-04-25)
src\main\java (0, 2017-04-25)
src\main\java\com (0, 2017-04-25)
src\main\java\com\cl (0, 2017-04-25)
src\main\java\com\cl\slack (0, 2017-04-25)
src\main\java\com\cl\slack\playaudio (0, 2017-04-25)
src\main\java\com\cl\slack\playaudio\MainActivity.java (34651, 2017-04-25)
src\main\java\com\cl\slack\playaudio\audio (0, 2017-04-25)
src\main\java\com\cl\slack\playaudio\audio\AudioDecoder.java (8408, 2017-04-25)
src\main\java\com\cl\slack\playaudio\audio\AudioEncoder.java (15492, 2017-04-25)
src\main\java\com\cl\slack\playaudio\audio\MixAudioInVideo.java (10668, 2017-04-25)
src\main\java\com\cl\slack\playaudio\audio\PlayBackMusic.java (5100, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media (0, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaAudioEncoder.java (901, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaDecoder.java (9400, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaEncoder.java (6422, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaFrame.java (1752, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaInfo.java (4276, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaMixAudio.java (3350, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaMuxerMixAudioAndVideo.java (3129, 2017-04-25)
src\main\java\com\cl\slack\playaudio\media\MediaVideoEncoder.java (917, 2017-04-25)
src\main\java\com\cl\slack\playaudio\permission (0, 2017-04-25)
src\main\java\com\cl\slack\playaudio\permission\Permissions.java (157, 2017-04-25)
src\main\java\com\cl\slack\playaudio\permission\PermissionsManager.java (18238, 2017-04-25)
src\main\java\com\cl\slack\playaudio\permission\PermissionsResultAction.java (6862, 2017-04-25)
src\main\java\com\cl\slack\playaudio\util (0, 2017-04-25)
... ...
try 实时录制audio时录制麦克风数据 和 写入背景音乐
没有处理权限的问题,需要先去设置里获取权限
```
## 实现
*MediaPlayer 播放音频
*AudioTrack 播放音频 mp3 --> pcm data ( libs/jl1.0.1.jar )
*AudioRecord 录制音频 pcm file
*AudioTrack 播放音频 pcm data
*AudioRecord 录制音频 use MediaCodec & MediaMuxer write data
*MediaExtractor 和 MediaCodec 手动解码出 pcm 数据
*混合音频
混合音频:
即背景播放的音乐和麦克风获取到的数据混合,混合时要保证这两个的一帧的数据长度一样
获取麦克风数据时 长度 2048 没有问题,再大一点 就会出 timestampUs 问题
背景音乐的播放 帧长度 2492 4608 4608 4608...(仅我的测试用例) MediaCodec.BufferInfo.size
但是一帧数据长度小于 这个值,播放时 杂音很大,而且播放速度不对 ,看来播放这块是动不了了
修复 error 部分 的 E/MPEG4Writer: timestampUs 6220411 < lastTimestampUs 6220442 for Audio track 就OK了
现在的问题 混合音频杂音很多
尝试不写入录制的麦克风数据,只是 背景播放的原始数据,速率不对 ,杂音严重 !!!
感觉是不是丢帧了 ,下面的代码在while里执行,可能会数据覆盖的太快
if (listener != null) {
listener.onFrameArrive(temp);
}
使用队列 ArrayDeque 记录音频背景音乐帧,不丢帧 使用ArrayList一样可以
```
```
## error
E/MPEG4Writer: timestampUs 6220411 < lastTimestampUs 6220442 for Audio track
这个问题与 record.read(buffer,0,samples_per_frame); samples_per_frame 参数的设置有关
int samples_per_frame = 2048; 但是开一个背景音乐,好像就嫌大了 so int samples_per_frame = 1024;
与mAudioCodec.queueInputBuffer(inputBufferIn
dex, 0, input.length, presentationTimeUs, 0);中presentationTimeUs貌似也有关系
so long presentationTimeUs = (System.nanoTime() - audioStartTime) / 1000L;
但是只要提高 samples_per_frame 必然出错
只能记录上一次的时间戳 然后加入判断 if(mLastAudioPresentationTimeUs < bufferInfo.presentationTimeUs)
这样 samples_per_frame 就可以随便设置了
```
近期下载者:
相关文件:
收藏者: