我使用MediaCodecAndroid SDK提供的类,因为API级别16与OMX.SEC.aac.enc编码器一起将音频编码为文件.我从AudioRecord课堂上得到了音频输入.我的AudioRecord类实例配置如下:
bufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_DEFAULT, bufferSize);
Run Code Online (Sandbox Code Playgroud)
我能够从AudioRecord实例播放原始数据,因此问题不在那里.
我将AudioRecord实例的输出写入ByteBuffer实例并将其传递给编码器的可用输入缓冲区.编码器的输出被写入SD卡上的文件.
这些是我的MediaCodec实例的配置参数:
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)
VLC告诉我,我的aac文件中没有流.该命令FFMPEG -i @filename@给出了以下错误:处理输入时找到无效数据.我测试过的所有媒体播放器都无法播放我的文件.
为什么我无法播放我的文件?我没有收到OpenMAX错误,LogCat应用程序在编码时不会崩溃.我写了一个视频编码器,它的工作原理与之相同.
这是将数据从AudioRecord实例读取到缓冲区的代码:
new Thread() {
public void run() { …Run Code Online (Sandbox Code Playgroud)