diff --git a/packages/griffith-mp4/src/mp4/utils/__tests__/getSamplesInterval.spec.js b/packages/griffith-mp4/src/mp4/utils/__tests__/getSamplesInterval.spec.js index c392eea8..3e4cc8ec 100644 --- a/packages/griffith-mp4/src/mp4/utils/__tests__/getSamplesInterval.spec.js +++ b/packages/griffith-mp4/src/mp4/utils/__tests__/getSamplesInterval.spec.js @@ -1,4 +1,5 @@ import { + getIntervalArray, getVideoSamplesInterval, getAudioSamplesInterval, getNextVideoSamplesInterval, @@ -42,4 +43,29 @@ describe('getSamplesInterval', () => { timeInterVal: [56056, 86086], }) }) + + it('should get the sample interval array when video has B/P frame', () => { + const mockStssBox = { + samples: [ + { + sampleNumber: 1, + }, + { + sampleNumber: 251, + }, + { + sampleNumber: 501, + }, + ], + } + expect(getIntervalArray(mockStssBox)).toEqual([0, 250, 500]) + }) + + it('should get the sample interval array when video has B/P frame', () => { + const mockStszBox = { + samples: [], + } + mockStszBox.samples.length = 21 + expect(getIntervalArray(undefined, mockStszBox)).toEqual([0, 5, 10, 15, 20]) + }) }) diff --git a/packages/griffith-mp4/src/mp4/utils/getSamplesInterval.js b/packages/griffith-mp4/src/mp4/utils/getSamplesInterval.js index ecac6a61..b926c3a2 100644 --- a/packages/griffith-mp4/src/mp4/utils/getSamplesInterval.js +++ b/packages/griffith-mp4/src/mp4/utils/getSamplesInterval.js @@ -7,7 +7,7 @@ export function getVideoSamplesInterval(mp4BoxTree, time = 0) { const stszBox = findBox(mp4BoxTree, 'videoStsz') const duration = getDuration(sttsBox, stszBox.samples.length) - const intervalArray = stssBox.samples.map(sample => sample.sampleNumber - 1) + const intervalArray = getIntervalArray(stssBox, stszBox) const timeInterval = intervalArray.map(interval => getDuration(sttsBox, interval) ) @@ -87,12 +87,13 @@ export function getAudioSamplesInterval(mp4BoxTree, videoInterval) { export function getNextVideoSamplesInterval(mp4BoxTree, sample) { const stssBox = cloneDeep(findBox(mp4BoxTree, 'videoStss')) - const intervalArray = stssBox.samples.map(sample => sample.sampleNumber - 1) const sttsBox = cloneDeep(findBox(mp4BoxTree, 'videoStts')) const stszBox = findBox(mp4BoxTree, 'videoStsz') const sampleCount = stszBox.samples.length const duration = getDuration(sttsBox, sampleCount) + const intervalArray = getIntervalArray(stssBox, stszBox) + const timeInterval = intervalArray.map(interval => getDuration(sttsBox, interval) ) @@ -114,3 +115,17 @@ export function getNextVideoSamplesInterval(mp4BoxTree, sample) { } return result } + +export function getIntervalArray(stssBox, stszBox) { + let intervalArray = [] + if (stssBox) { + intervalArray = stssBox.samples.map(sample => sample.sampleNumber - 1) + } else { + // make a fake GOP when video dont have B/P frame + for (let i = 0; i <= Math.floor(stszBox.samples.length / 5); i++) { + intervalArray.push(i * 5) + } + } + + return intervalArray +} diff --git a/packages/griffith-mp4/src/mp4/utils/index.js b/packages/griffith-mp4/src/mp4/utils/index.js index 60c46245..71a63f91 100644 --- a/packages/griffith-mp4/src/mp4/utils/index.js +++ b/packages/griffith-mp4/src/mp4/utils/index.js @@ -5,6 +5,7 @@ import getFragmentPosition from './getFragmentPosition' import getBufferStart from './getBufferStart' import {getVideoSamples, getAudioSamples} from './getSamples' import { + getIntervalArray, getAudioSamplesInterval, getVideoSamplesInterval, getNextVideoSamplesInterval, @@ -15,6 +16,7 @@ import getDuration from './getDuration' export { findBox, getDuration, + getIntervalArray, getSamplesOffset, getPerChunkArray, getFragmentPosition,