我正在尝试使用Mediacodec
使用aac
编解码器对一些音频流进行编码。为此,我使用了google cts ExtractEncodeMust的这个实现。
对于某些aac文件,它会在编码某些帧后抛出BufferOverflow Exception
。更准确地说,它会在第1030行抛出异常,编码器InputBuffer.put(decderOutputBuffer);
。
我正在配置outputAudioFormat
如下:
MediaFormat outputAudioFormat = MediaFormat.createAudioFormat(
inputAudioFormat.getString(MediaFormat.KEY_MIME),
inputAudioFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE),
inputAudioFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)
);
outputAudioFormat.setInteger(MediaFormat.KEY_BIT_RATE, outputAudioBitRate);
我完全不知道如何解决这个问题。任何形式的帮助都将不胜感激。
带有一些日志的堆栈跟踪:
W/MPEG4Writer: Timed-out waiting for video track to reach final audio timestamp !
D/MPEG4Writer: Video track source stopping
Video track source stopped
Video track stopped. Stop source
Duration from tracks range is [0, 125135] us
Stopping writer thread
D/MPEG4Writer: 0 chunks are written in the last batch
D/MPEG4Writer: Writer thread stopped
W/System.err: java.nio.BufferOverflowException
at java.nio.ByteBuffer.put(ByteBuffer.java:611)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:256)
导致溢出的示例文件信息:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Sample/sample.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 2017-11-10T09:36:00.000000Z
encoder : Lavf57.71.100
Duration: 01:58:17.26, start: 0.000000, bitrate: 2726 kb/s
Stream #0:0(und): Video: h264, 1 reference frame (avc1 / 0x31637661), yuv420p(left), 1920x804 (1920x816) [SAR 1:1 DAR 160:67], 2497 kb/s, 23.98 fps, 23.98 tbr, 11988 tbn, 47.95 tbc (default)
Metadata:
creation_time : 2017-11-10T09:36:00.000000Z
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 224 kb/s (default)
Metadata:
creation_time : 2017-11-10T09:36:00.000000Z
handler_name : SoundHandler
更新:
日志显示AudioDecodeBufferInfo。大小=12288 | |编码器输入缓冲区。在引发溢出异常之前,limit()=4096
。
以及解码音频格式的日志
:
audio decoder: output format changed: {sample-rate=48000, pcm-encoding=2, mime=audio/raw, channel-count=6}
BufferOverflowException
发生在生产者(如解码器)和消费者(如编码器)之间没有就缓冲区大小达成一致时。
配置编码器时,它会根据接收到的MediaFormat
中的信息分配输入缓冲区。AAC的标准数据包大小为1024帧。帧大小=样本大小*通道计数。PCM 16位(默认编码)每个样本使用2个字节。
因此,根据您提供的信息,编码器应该分配大小为1024*2*6=12288字节的缓冲区。然而,在您的例子中,它实际上只分配4096字节。因此,我假设编码器忽略了通道计数
属性,并默认为2个通道。它可能在日志上印了一些警告。
您仍然可以做的一件事是手动将每帧中的通道数减少到最多2个。您需要分配一个新的缓冲区,并将解码后的数据复制到其中,同时跳过每N个样本。在将结果缓冲区传递给编码器之前,不要忘记对其进行回放。
我正在尝试使用android AudioRecord和MediaCodec对aac音频进行编码。我创建了一个非常类似于(使用Android MediaCodec从相机编码H.264)的编码器类。使用此类,我创建了一个AudioRecord实例,并告诉它将其byte[]数据读出到AudioEncoder(audioEncoder.offerEncoder(Data))。 这是我的音频记录设置 我成功
我正在使用MediaCodec将PCM数据转换为AAC,并使用MediaMuxer将此aac数据存储到m4a文件中。没有视频。 该文件会生成,甚至会播放。但是没有声音。如果我将aac文件导入Audacity,它不会显示任何数据。音频的长度甚至是预期的时间。我知道数据正在被编码,尽管我不确定这些数据是否被正确编码。 对pcm数据进行编码: 我已经浏览了大量示例,我所做的一切似乎都是正确的。如果我在o
我正在修改一个Android框架示例,将MediaCodec生成的基本AAC流打包成一个独立的。mp4文件。我使用的是一个实例,其中包含一个由实例生成的AAC曲目。 然而,我总是最终得到一个错误消息调用:
我正在尝试使用MediaCodec和MediaMuxer对来自相机的视频和来自麦克风的音频进行编码。我在录制时使用OpenGL在图像上覆盖文本。 我以这些课程为例: http://bigflake.com/mediacodec/CameraToMpegTest.java.txt https://github.com/OnlyInAmerica/HWEncoderExperiments/blob/m
我想修剪现有的aac-mp4音频文件。我第一次想“修剪”0个字节,基本上就是使用MediaCodec/MediaExtractor复制文件。 问题: 标题是固定大小的,我可以从旧文件中复制它?或者它有一些关于音轨持续时间的信息,我需要更新它?如果它有固定大小,那是什么(为了知道我应该从旧文件中复制多少字节)? 我应该只使用提取器的getSampleData(ByteBuffer,偏移量)和进步()
问题很简单,但我没有任何线索来解决它: 我编写一行代码来在我的Nexus 4(Android 4.4.2)上创建AAC编码器 保存在“codec”中的返回值不为空,但我在Logcat中收到一条红色错误消息: 我还尝试了另一条线: 并得到相同的错误结果。 在使用MediaCodec之前,我是否错过了任何初始化步骤?我在官方文档中没有找到有关此的任何信息。 有人遇到过这个问题吗? 实际上,我正在尝试将