Anrdoid media中input buffer读取与控制

本文详细解析了APK文件处理过程中的max-input-size参数如何通过extractor抓取,并将其设置给MediaCodec/ACodec。同时讨论了ACodec在处理数据时如何与allocatedinputbuffersize进行比较,以及当max-input-size超过后者时可能导致的失败情况。extractor在获取每一帧数据时,会设定最大数据大小为max-input-size。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

APK 通过extractor获取文件中的max-input-size并通过configCodec设给MediaCodec/ACodec.

ACodec用max-input-size同allocated input buffer size做比较,如果前者大于后者则返回失败。


extractor按照自己的逻辑去抓取每一帧数据,extractor中最大的数据size设为max-input-size

要使用Android的MediaFormat和MediaCodec来录制音频,需要以下步骤: 1. 创建一个MediaFormat对象,设置音频编码格式、采样率、比特率等参数。 2. 创建一个MediaCodec对象,将上一步中创建的MediaFormat对象作为参数传入。 3. 调用MediaCodec的configure方法,将MediaFormat对象作为参数传入。 4. 调用MediaCodec的start方法,开始录制音频。 5. 获取输入缓冲区和输出缓冲区,将音频数据写入输入缓冲区。 6. 从输出缓冲区读取编码后的音频数据。 7. 将编码后的音频数据写入文件或传输到网络等。 8. 调用MediaCodec的stop和release方法,停止和释放资源。 以下是一个简单的示例代码: ``` MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 44100, 1); format.setInteger(MediaFormat.KEY_BIT_RATE, 64000); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16384); MediaCodec codec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC); codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); codec.start(); ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers(); while (true) { int inputBufferIndex = codec.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; // 将音频数据写入输入缓冲区 codec.queueInputBuffer(inputBufferIndex, 0, inputBuffer.limit(), presentationTimeUs, 0); } MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0); if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex]; // 从输出缓冲区读取编码后的音频数据 byte[] encodedData = new byte[bufferInfo.size]; outputBuffer.get(encodedData); // 将编码后的音频数据写入文件或传输到网络等 codec.releaseOutputBuffer(outputBufferIndex, false); } } codec.stop(); codec.release(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值