OBS から送られて来るHLSライブストリームのAACにEncoderDelay(Primary + Remainder)が含まれているか確認します。
- https://www.youtube.com/watch?v=Oc8cLx9MXSo をOBS で配信する
- PCM 再生処理の前に以下の DummaySample を挿入する
- leftChannelWithDummy を再生し波形を確認する
var context = new AudioContext();
var stream = new Uint8Array(...); // AAC
context.decodeAudioData(stream.buffer, function(audioBuffer) { // @arg AudioBuffer - { duration, length, numberOfChannels }
// 無音区間が
// PrimarySamples なのか
// RemainderSamples なのか区別するため、ダミーデータを入れる
// 先頭部分に new Float32Array(1024) = [1.0 .. 1.0] を挿入する
var leftChannel = audioBuffer.getChannelData(0);
var leftChannelWithDummy = new Float32Array(1024 + leftChannel.length);
for (var i = 0, iz = 1024; i < iz; ++i) {
leftChannelWithDummy[i] = 1.0;
}
leftChannelWithDummy.set(leftChannel, 1024);
});
この波形を見る限り、OBSから配信されるHLS経由のAACにはPrimarySampleが含まれており、RemainderSampleは含まれていない事がわかります。
またこのケースでは、PrimarySample の長さは 0.01017 ほどで、この値を (1 / 44100 = 0.00002267573696) で割ると 450 samples ほどになるようです。
0.01017 / 0.00002267573696 = 448.49 samples