生の 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 ストリームにパッケージ化する方法を誰が教えてくれますか?
私はこの分野で初めてです。間違いを許してください。