J.N*_*Ney 5 android aac audio-streaming gstreamer android-mediacodec
我想构建一个应用程序来播放由我的Raspberry Pi和Gstreamer发送的 AAC 音频流。这是我在 Gstreamer 中设置的管道:
gst-launch-1.0 audiotestsrc ! faac "bitrate=64000" ! "audio/mpeg, mpegversion=4, rate = 44100, channels = 1" ! mux. mpegtsmux name=mux! udpsink host=224.0.0.1 port=8001
Run Code Online (Sandbox Code Playgroud)
它将 AAC LC 中的音频数据编码为 mp4,比特率为 64000,采样率为 44100,在 mpeg ts 容器中为 1 个通道。
我使用以下代码设置了我的解码器:
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
format.setInteger(MediaFormat.KEY_IS_ADTS, 1);
byte[] bytes = new byte[]{(byte) 0x11, (byte)0x90};
ByteBuffer bb = ByteBuffer.wrap(bytes);
format.setByteBuffer("csd-0", bb);
Run Code Online (Sandbox Code Playgroud)
我也试过没有MediaFormat.KEY_IS_ADTS线。(同样的错误)
这是我的解码器的样子:
while (!stopTrack) {
multicastSocket.receive(packet);
decoder.start();
data = packet.getData();
inputBuffers = decoder.getInputBuffers();
outputBuffers = decoder.getOutputBuffers();
inputBufferIndex = decoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0)
{
inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(data);
decoder.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
}
bufferInfo = new MediaCodec.BufferInfo();
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0)
{
outputBuffer = outputBuffers[outputBufferIndex];
outputBuffer.position(bufferInfo.offset);
outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
outData = new byte[bufferInfo.size];
outputBuffer.get(outData);
Log.d("AudioDecoder", outData.length + " bytes decoded");
track.write(outData, 0, outData.length);
decoder.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
W/SoftAAC2: aacDecoder_DecodeFrame decoderErr = 0x4004
W/SoftAAC2: AAC decoder returned error 0x4004, substituting silence
I/SoftAAC2: Reconfiguring decoder: 0->48000 Hz, 0->0 channels
E/AndroidRuntime: FATAL EXCEPTION: Thread-374583
Run Code Online (Sandbox Code Playgroud)
如果我将传入的数据保存到文件中,它就可以播放!所以问题一定是解码器。
谢谢你的帮助!
| 归档时间: |
|
| 查看次数: |
1507 次 |
| 最近记录: |