diff --git a/example/webpack.config.js b/example/webpack.config.js index 7b23db19..73d0dc6c 100644 --- a/example/webpack.config.js +++ b/example/webpack.config.js @@ -25,6 +25,12 @@ module.exports = env => { changeOrigin: true, secure: false, }, + '/vzuu': { + target: 'https://vdn1.vzuu.com/', + pathRewrite: {'^/vzuu': ''}, + changeOrigin: true, + secure: false, + }, }, }, diff --git a/package.json b/package.json index 9f5db072..ff91cb3f 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ ], "scripts": { "format": "prettier \"packages/**/*.{js,json,md}\" \"*.{js,json,md}\"", + "format:fix": "prettier --write \"packages/**/*.{js,json,md}\" \"*.{js,json,md}\"", "lint": "eslint 'packages/*/src/**/*.js' '*.js'", "test": "jest", "test:coverage": "jest --coverage", diff --git a/packages/griffith-mp4/src/mp4/utils/getBufferStart.js b/packages/griffith-mp4/src/mp4/utils/getBufferStart.js index 5b045471..0ba3453c 100644 --- a/packages/griffith-mp4/src/mp4/utils/getBufferStart.js +++ b/packages/griffith-mp4/src/mp4/utils/getBufferStart.js @@ -52,5 +52,11 @@ function getChunkSize(mp4BoxTree, offsetStart, type) { type === 'video' ? 'videoStco' : 'audioStco' ) + // 如果最后一个 GOP 没有音频轨,BufferStart 需要按照视频轨来计算。 + // If the last GOP dont have audio track, we should ignore the audio chunk size. + if (chunkIndex >= stcoBox.samples.length) { + return Number.MAX_SAFE_INTEGER + } + return stcoBox.samples[chunkIndex].chunkOffset + sampleSize } diff --git a/packages/griffith-mp4/src/mp4/utils/getFragmentPosition.js b/packages/griffith-mp4/src/mp4/utils/getFragmentPosition.js index 636d1273..6c7af64e 100644 --- a/packages/griffith-mp4/src/mp4/utils/getFragmentPosition.js +++ b/packages/griffith-mp4/src/mp4/utils/getFragmentPosition.js @@ -6,8 +6,15 @@ export default function getFragmentPosition( ) { const videoSamplesEnd = videoSamples[videoSamples.length - 1].end const videoSamplesStart = videoSamples[0].start - const audioSamplesEnd = audioSamples[audioSamples.length - 1].end - const audioSamplesStart = audioSamples[0].start + + // maybe the last GOP dont have audio track + // 最后一个 GOP 序列可能没有音频轨 + let audioSamplesEnd = 0 + let audioSamplesStart = Number.MAX_SAFE_INTEGER + if (audioSamples.length !== 0) { + audioSamplesEnd = audioSamples[audioSamples.length - 1].end + audioSamplesStart = audioSamples[0].start + } const fragmentEndPosition = isLastFragmentPosition ? '' diff --git a/packages/griffith-mp4/src/mse/controller.js b/packages/griffith-mp4/src/mse/controller.js index 32864a78..9a92a45d 100644 --- a/packages/griffith-mp4/src/mse/controller.js +++ b/packages/griffith-mp4/src/mse/controller.js @@ -144,13 +144,18 @@ export default class MSE { FMP4.mdat(videoTrackInfo) ) - const audioRawData = concatTypedArray( - FMP4.moof(audioTrackInfo, audioBaseMediaDecodeTime), - FMP4.mdat(audioTrackInfo) - ) + // maybe the last GOP dont have audio track + // 最后一个 GOP 序列可能没有音频轨 + if (audioTrackInfo.samples.length !== 0) { + const audioRawData = concatTypedArray( + FMP4.moof(audioTrackInfo, audioBaseMediaDecodeTime), + FMP4.mdat(audioTrackInfo) + ) + this.sourceBuffers.audio.appendBuffer(audioRawData) + } this.sourceBuffers.video.appendBuffer(videoRawData) - this.sourceBuffers.audio.appendBuffer(audioRawData) + if (time) { this.needUpdateTime = true }