android aac编码 封装,将wav编码为Android上的AAC

看看这件漂亮(,可以正常使用)例如: Mp4ParserSample

看那类(行335-442)的最后一部分,convert Runnable对象只是做这份工作!您必须根据需要调整代码,调整输入和输出文件路径以及转换参数(采样率,比特率等)。

public static final String AUDIO_RECORDING_FILE_NAME = "audio_Capturing-190814-034638.422.wav"; // Input PCM file

public static final String COMPRESSED_AUDIO_FILE_NAME = "convertedmp4.m4a"; // Output MP4/M4A file

public static final String COMPRESSED_AUDIO_FILE_MIME_TYPE = "audio/mp4a-latm";

public static final int COMPRESSED_AUDIO_FILE_BIT_RATE = 64000; // 64kbps

public static final int SAMPLING_RATE = 48000;

public static final int BUFFER_SIZE = 48000;

public static final int CODEC_TIMEOUT_IN_MS = 5000;

String LOGTAG = "CONVERT AUDIO";

Runnable convert = new Runnable() {

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

@Override

public void run() {

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);

try {

String filePath = Environment.getExternalStorageDirectory().getPath() + "/" + AUDIO_RECORDING_FILE_NAME;

File inputFile = new File(filePath);

FileInputStream fis = new FileInputStream(inputFile);

File outputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + COMPRESSED_AUDIO_FILE_NAME);

if (outputFile.exists()) outputFile.delete();

MediaMuxer mux = new MediaMuxer(outputFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

MediaFormat outputFormat = MediaFormat.createAudioFormat(COMPRESSED_AUDIO_FILE_MIME_TYPE,SAMPLING_RATE, 1);

outputFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);

outputFormat.setInteger(MediaFormat.KEY_BIT_RATE, COMPRESSED_AUDIO_FILE_BIT_RATE);

outputFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16384);

MediaCodec codec = MediaCodec.createEncoderByType(COMPRESSED_AUDIO_FILE_MIME_TYPE);

codec.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

codec.start();

ByteBuffer[] codecInputBuffers = codec.getInputBuffers(); // Note: Array of buffers

ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers();

MediaCodec.BufferInfo outBuffInfo = new MediaCodec.BufferInfo();

byte[] tempBuffer = new byte[BUFFER_SIZE];

boolean hasMoreData = true;

double presentationTimeUs = 0;

int audioTrackIdx = 0;

int totalBytesRead = 0;

int percentComplete = 0;

do {

int inputBufIndex = 0;

while (inputBufIndex != -1 && hasMoreData) {

inputBufIndex = codec.dequeueInputBuffer(CODEC_TIMEOUT_IN_MS);

if (inputBufIndex >= 0) {

ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];

dstBuf.clear();

int bytesRead = fis.read(tempBuffer, 0, dstBuf.limit());

Log.e("bytesRead","Readed "+bytesRead);

if (bytesRead == -1) { // -1 implies EOS

hasMoreData = false;

codec.queueInputBuffer(inputBufIndex, 0, 0, (long) presentationTimeUs, MediaCodec.BUFFER_FLAG_END_OF_STREAM);

} else {

totalBytesRead += bytesRead;

dstBuf.put(tempBuffer, 0, bytesRead);

codec.queueInputBuffer(inputBufIndex, 0, bytesRead, (long) presentationTimeUs, 0);

presentationTimeUs = 1000000l * (totalBytesRead/2)/SAMPLING_RATE;

}

}

}

// Drain audio

int outputBufIndex = 0;

while (outputBufIndex != MediaCodec.INFO_TRY_AGAIN_LATER) {

outputBufIndex = codec.dequeueOutputBuffer(outBuffInfo, CODEC_TIMEOUT_IN_MS);

if (outputBufIndex >= 0) {

ByteBuffer encodedData = codecOutputBuffers[outputBufIndex];

encodedData.position(outBuffInfo.offset);

encodedData.limit(outBuffInfo.offset + outBuffInfo.size);

if ((outBuffInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0 && outBuffInfo.size != 0) {

codec.releaseOutputBuffer(outputBufIndex, false);

}else{

mux.writeSampleData(audioTrackIdx, codecOutputBuffers[outputBufIndex], outBuffInfo);

codec.releaseOutputBuffer(outputBufIndex, false);

}

} else if (outputBufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {

outputFormat = codec.getOutputFormat();

Log.v(LOGTAG, "Output format changed - " + outputFormat);

audioTrackIdx = mux.addTrack(outputFormat);

mux.start();

} else if (outputBufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {

Log.e(LOGTAG, "Output buffers changed during encode!");

} else if (outputBufIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {

// NO OP

} else {

Log.e(LOGTAG, "Unknown return code from dequeueOutputBuffer - " + outputBufIndex);

}

}

percentComplete = (int) Math.round(((float) totalBytesRead/(float) inputFile.length()) * 100.0);

Log.v(LOGTAG, "Conversion % - " + percentComplete);

} while (outBuffInfo.flags != MediaCodec.BUFFER_FLAG_END_OF_STREAM);

fis.close();

mux.stop();

mux.release();

Log.v(LOGTAG, "Compression done ...");

} catch (FileNotFoundException e) {

Log.e(LOGTAG, "File not found!", e);

} catch (IOException e) {

Log.e(LOGTAG, "IO exception!", e);

}

//mStop = false;

// Notify UI thread...

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值