android 使用AudioRecord + MediaCodec+屏幕录制+mp4v2 录制mp4 ,没有声音?求大神解答一下!

while(1){} 2017-06-24 06:17:48
/**
* 初始化
*/
private Params initAudioDevice() {
int[] sampleRates = {44100, 22050, 16000, 11025};
for (int sampleRate :
sampleRates) {
//编码制式
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// stereo 立体声,
int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int buffsize = 2 * AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig,
audioFormat, buffsize);
if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
continue;
}
this.buffer = new byte[Math.min(4096, buffsize)];

return new Params(sampleRate,
channelConfig == AudioFormat.CHANNEL_CONFIGURATION_STEREO ? 2 : 1);
}

return null;
}
/**
* 开始录音
*/
public void start() {
workThread = new Thread() {
@Override
public void run() {
mAudioRecord.startRecording();
while (loop && !Thread.interrupted()) {
int size = mAudioRecord.read(buffer, 0, buffer.length);
if (size < 0) {
LogUtil.i("audio ignore ,no data to read");
break;
}
if (loop) {
byte[] audio = new byte[size];
System.arraycopy(buffer, 0, audio, 0, size);
if (mCallback != null) {
mCallback.audioData(audio);
}
}
}

}
};

loop = true;
workThread.start();
}


MedaiCodec 编码器部分

MediaCodec aencoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC,
sampleRate, chanelCount);
format.setInteger(KEY_MAX_INPUT_SIZE, 0);
format.setInteger(KEY_BIT_RATE, sampleRate * chanelCount);
aencoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

/**
* 音频编码
*
* @param data
*/
private void encodeAudioData(byte[] data) {
ByteBuffer[] inputBuffers = aEncoder.getInputBuffers();
ByteBuffer[] outputBuffers = aEncoder.getOutputBuffers();
int inputBufferId = aEncoder.dequeueInputBuffer(-1);
if (inputBufferId >= 0) {
ByteBuffer bb = inputBuffers[inputBufferId];
bb.clear();
bb.put(data, 0, data.length);
long pts = new Date().getTime() * 1000 - presentationTimeUs;
aEncoder.queueInputBuffer(inputBufferId, 0, data.length, pts, 0);
}

int outputBufferIndex = aEncoder.dequeueOutputBuffer(aBufferInfo, -1);
while (outputBufferIndex >= 0) { //编码器有可能一次性突出多条数据 所以使用while
// outputBuffers[outputBufferId] is ready to be processed or rendered.
ByteBuffer bb = outputBuffers[outputBufferIndex];

LogUtil.i(aBufferInfo.size + " -- aac -- byte *********");
parserAudioEncodeData(bb, aBufferInfo);
aEncoder.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = aEncoder.dequeueOutputBuffer(aBufferInfo, 0);
}

}

使用 MP4v2库合成 MP4

recordCtx->m_aTrackId = MP4AddAudioTrack(recordCtx->m_mp4FHandle, 8000, 160, MP4_MPEG4_AUDIO_TYPE);
if (recordCtx->m_aTrackId == MP4_INVALID_TRACK_ID){
printf("error : MP4AddAudioTrack \n");
return NULL;
}

MP4SetAudioProfileLevel(recordCtx->m_mp4FHandle, 0x02);// 2, 1// uint8_t aacConfig[2] = {18,16};
//uint8_t aacConfig[2] = {0x14, 0x10};
uint8_t aacConfig[2] = {0x15,0x88};
MP4SetTrackESConfiguration(recordCtx->m_mp4FHandle,recordCtx->m_aTrackId,aacConfig,2);

int mp4AEncode(MP4V2_CONTEXT * recordCtx, uint8_t * data ,int len){
if(recordCtx->m_vTrackId == MP4_INVALID_TRACK_ID){
LOGI("aac写入失败!");
return -1;
}
LOGI("aac写入成功!");
MP4WriteSample(recordCtx->m_mp4FHandle, recordCtx->m_aTrackId, data, len , MP4_INVALID_DURATION, 0, 1);
recordCtx->m_vFrameDur += 160;
return 0;
}


录制的MP4文件没有声音 求大神解答一下,谢谢! (视频没有问题 没有贴出代码!)
...全文
288 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧