From c516352a01d50ec6612940c83389e804fb98537a Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Mon, 25 Nov 2024 14:41:05 +0900 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=83=81=E3=83=A3=E3=83=8D?= =?UTF-8?q?=E3=83=AB=E6=95=B0=E3=81=AE=E6=8C=87=E5=AE=9A=E3=83=9F=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp4-media-stream/src/audio_processor.js | 14 +++-------- .../mp4-media-stream/src/mp4_media_stream.ts | 25 ++++++++++--------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/packages/mp4-media-stream/src/audio_processor.js b/packages/mp4-media-stream/src/audio_processor.js index 3d3592b0..0064474e 100644 --- a/packages/mp4-media-stream/src/audio_processor.js +++ b/packages/mp4-media-stream/src/audio_processor.js @@ -10,7 +10,6 @@ class Mp4MediaStreamAudioWorkletProcessor extends AudioWorkletProcessor { } process(inputs, outputs, parameters) { - const outputChannel = outputs[0][0] for (let sampleIdx = 0; sampleIdx < outputs[0][0].length; sampleIdx++) { for (let channelIdx = 0; channelIdx < outputs[0].length; channelIdx++) { const outputChannel = outputs[0][channelIdx] @@ -20,17 +19,12 @@ class Mp4MediaStreamAudioWorkletProcessor extends AudioWorkletProcessor { } else { outputChannel[sampleIdx] = audioData.samples[this.offset] this.offset++ + if (this.offset === this.inputBuffer[0].samples.length) { + this.inputBuffer.shift() + this.offset = 0 + } } } - - if (this.inputBuffer[0] === undefined) { - continue - } - - if (this.offset === this.inputBuffer[0].samples.length) { - this.inputBuffer.shift() - this.offset = 0 - } } return true } diff --git a/packages/mp4-media-stream/src/mp4_media_stream.ts b/packages/mp4-media-stream/src/mp4_media_stream.ts index 5e86ac77..6b7a3213 100644 --- a/packages/mp4-media-stream/src/mp4_media_stream.ts +++ b/packages/mp4-media-stream/src/mp4_media_stream.ts @@ -19,8 +19,6 @@ interface PlayOptions { const AUDIO_DECODER_ID: number = 0 const VIDEO_DECODER_ID: number = 1 -const OPUS_SAMPLE_RATE: number = 48000 - /** * MP4 を入力にとって、それを再生する MediaStream を生成するクラス */ @@ -152,7 +150,7 @@ class Mp4MediaStream { const playerId = this.nextPlayerId this.nextPlayerId += 1 - const player = new Player(this.info.audioConfigs.length > 0, this.info.videoConfigs.length > 0) + const player = new Player(this.info.audioConfigs, this.info.videoConfigs.length > 0) this.players.set(playerId, player) ;(this.wasm.exports.play as CallableFunction)( this.engine, @@ -298,13 +296,11 @@ class Mp4MediaStream { try { // TODO: add timestamp handling (in processor) - console.log(data.numberOfChannels) - const channels = data.numberOfChannels const samples = new Float32Array(data.numberOfFrames * data.numberOfChannels) data.copyTo(samples, { planeIndex: 0 }) const timestamp = data.timestamp - player.audioInputNode.port.postMessage({ timestamp, channels, samples }, [samples.buffer]) + player.audioInputNode.port.postMessage({ timestamp, samples }, [samples.buffer]) } catch (e) { // 書き込みエラーが発生した場合には再生を停止する await this.stopPlayer(playerId) @@ -318,7 +314,6 @@ class Mp4MediaStream { }, } - player.numberOfChannels = config.numberOfChannels player.audioDecoder = new AudioDecoder(init) player.audioDecoder.configure(config) ;(this.wasm.exports.notifyDecoderId as CallableFunction)( @@ -425,28 +420,34 @@ type Mp4Info = { class Player { private audio: boolean private video: boolean + private numberOfChannels = 1 + private sampleRate = 48000 audioDecoder?: AudioDecoder videoDecoder?: VideoDecoder canvas?: HTMLCanvasElement canvasCtx?: CanvasRenderingContext2D audioContext?: AudioContext audioInputNode?: AudioWorkletNode - numberOfChannels = 1 - constructor(audio: boolean, video: boolean) { - this.audio = audio + constructor(audioConfigs: AudioDecoderConfig[], video: boolean) { + this.audio = audioConfigs.length > 0 this.video = video + + if (audioConfigs.length > 0) { + this.numberOfChannels = audioConfigs[0].numberOfChannels + this.sampleRate = audioConfigs[0].sampleRate + } } async createMediaStream(): Promise { const tracks = [] if (this.audio) { const blob = new Blob([AUDIO_WORKLET_PROCESSOR_CODE], { type: 'application/javascript' }) - this.audioContext = new AudioContext({ sampleRate: OPUS_SAMPLE_RATE }) + this.audioContext = new AudioContext({ sampleRate: this.sampleRate }) await this.audioContext.audioWorklet.addModule(URL.createObjectURL(blob)) const workletOptions = { - numberOfOutputs: this.numberOfChannels, + outputChannelCount: [this.numberOfChannels], } this.audioInputNode = new AudioWorkletNode( this.audioContext,