Android编码流(H264 / AAC)音频无法在Flash Player

时间:2016-04-27 19:35:38

标签: android flash mediacodec aac

我正致力于为Android应用添加直播功能。我通过RTMP这样做,并使用DailyMotion Android SDK,后者又使用Kickflip

除了在网站上播放音频(使用Flash)外,一切都很完美。音频在VLC中可以正常工作,因此Flash似乎无法解码AAC音频。

对于音频,我使用" audio / mp4a-latm"来实例化编码器。哑剧型。 Android开发人员文档声明了以下有关此mime类型的内容:" audio / mp4a-latm" - AAC音频(注意,这是原始AAC数据包,未包装在LATM中!)。我希望我的问题在于此,但我还是找不到解决方案。

我的所有研究,包括关于此事的this SO question,都指向了我向音频字节数组添加ADTS标头的方向。这导致writeSampleData方法中的以下代码:

boolean isHeader = false;
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
    isHeader = true;
} else {
    pts = bufferInfo.presentationTimeUs - mFirstPts;
}

if (mFirstPts != -1 && pts >= 0) {
    pts /= 1000;

    byte data[] = new byte[bufferInfo.size + 7];
    addADTStoPacket(data, bufferInfo.size + 7);
    encodedData.position(bufferInfo.offset);
    encodedData.get(data, 7, bufferInfo.size);

    addDataPacket(new AudioPacket(data, isHeader, pts, mAudioFirstByte));
}

addADTStoPacket方法与上面提到的SO帖子中的方法完全相同,但无论如何我都会在这里显示:

private void addADTStoPacket(byte[] packet, int packetLen) {
    int profile = 2;  //AAC LC
    //39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
    int freqIdx = 4;  //44.1KHz
    int chanCfg = 1;  //CPE

    // fill in ADTS data
    packet[0] = (byte)0xFF;
    packet[1] = (byte)0xF9;
    packet[2] = (byte)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2));
    packet[3] = (byte)(((chanCfg&3)<<6) + (packetLen>>11));
    packet[4] = (byte)((packetLen&0x7FF) >> 3);
    packet[5] = (byte)(((packetLen&7)<<5) + 0x1F)
    packet[6] = (byte)0xFC;
}

上述方法中的变量与我在应用程序中配置的设置相匹配,所以我非常确定这很好。

使用以下AudioPacket类的方法将数据写入输出流:

@Override
public void writePayload(OutputStream outputStream) throws IOException {
    outputStream.write(mFirstByte);
    outputStream.write(mIsAudioSpecificConfic ? 0 : 1);
    outputStream.write(mData);
}

我在这里遗漏了什么吗?如有必要,我可以提供更多代码,但我认为这涵盖了最相关的部分。提前谢谢,我真的希望有人能够提供帮助,我已经被困了几天了......

0 个答案:

没有答案