Skip to content

CL-window/audio_mix

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 

Repository files navigation

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 就可以随便设置了

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages