0

生の AAC データを MPEG2-TS ストリームにパッケージ化するにはどうすればよいですか?

私は継続的に録音(マイク)し、Android内のPCMオーディオをAACに圧縮しています:

    encoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
    MediaFormat format = new MediaFormat();
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
    format.setInteger(MediaFormat.KEY_AAC_PROFILE,
            MediaCodecInfo.CodecProfileLevel.AACObjectLC);
    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

これにより生のヘッドレス AAC が生成されるため、各フレームに必要な MPEG ヘッダーも追加します。

    private void addADTStoPacket(byte[] packet, int packetLen) {
    int profile = 2; // M4A LC
                        // 39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
    int freqIdx = 4; // 44.1KHz
    int chanCfg = 2; // 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;
    packet[6] = (byte) 0x00;// number of frames = 1;
}

これは正常に機能しており、作成された AAC ファイルを再生できます。VLC または Google Music Player で。

今私の質問:

WAV および MP3 ストリームで既に行っているように、エンコードされたデータを HTTP LIVE STREAM (HLS) として一部のレンダラーに送信したいと考えています。

しかし、Androidアプリに送信している場合、記録を中断してストリームをフラッシュ/終了するまで、ストリームの再生は開始されません。MP3 では問題ありません。数秒後に再生が開始されます。

Androidの「サポートされているメディア タイプ」ページに関して、HLS は、

HTTP/HTTPS ライブ ストリーミング ドラフト プロトコル: MPEG-2 TS メディア ファイルのみ

現在のように MPEG4 ストリームではなく、生の AAC ストリームを MPEG-2 TS ストリームにパッケージ化する方法を誰が教えてくれますか?

私はこの分野で初めてです。間違いを許してください。

4

1 に答える 1