diff --git a/src/media-segment-request.js b/src/media-segment-request.js index 08acdae83..9f7c5cd61 100644 --- a/src/media-segment-request.js +++ b/src/media-segment-request.js @@ -295,7 +295,7 @@ const transmuxAndNotify = ({ }); trackInfoFn = null; - if (probeResult.hasAudio) { + if (probeResult.hasAudio && !isMuxed) { audioStartFn(probeResult.audioStart); } if (probeResult.hasVideo) { @@ -411,7 +411,6 @@ const handleSegmentBytes = ({ if (tracks.video && tracks.audio) { trackInfo.isMuxed = true; - trackInfo.hasAudio = false; } // since we don't support appending fmp4 data on progress, we know we have the full @@ -425,7 +424,7 @@ const handleSegmentBytes = ({ // decoding). const timingInfo = mp4probe.startTime(segment.map.timescales, bytesAsUint8Array); - if (trackInfo.hasAudio) { + if (trackInfo.hasAudio && !trackInfo.isMuxed) { timingInfoFn(segment, 'audio', 'start', timingInfo); } @@ -438,7 +437,7 @@ const handleSegmentBytes = ({ // for it to be audio only. See `tracks.video && tracks.audio` if statement // above. // we make sure to use segment.bytes here as that - dataFn(segment, {data: bytes, type: trackInfo.hasAudio ? 'audio' : 'video'}); + dataFn(segment, {data: bytes, type: trackInfo.hasAudio && !trackInfo.isMuxed ? 'audio' : 'video'}); if (captions && captions.length) { captionsFn(segment, captions); } diff --git a/src/segment-loader.js b/src/segment-loader.js index e713bc40d..8e1ade699 100644 --- a/src/segment-loader.js +++ b/src/segment-loader.js @@ -637,9 +637,9 @@ export default class SegmentLoader extends videojs.EventTarget { } if (this.loaderType_ === 'main') { - const { hasAudio, hasVideo } = this.startingMedia_; + const { hasAudio, hasVideo, isMuxed } = this.startingMedia_; - if (hasVideo && hasAudio && !this.audioDisabled_) { + if (hasVideo && hasAudio && !this.audioDisabled_ && !isMuxed) { return this.sourceUpdater_.buffered(); } @@ -1684,11 +1684,14 @@ export default class SegmentLoader extends videojs.EventTarget { } if (!this.handlePartialData_) { - if (this.startingMedia_.hasVideo && !segmentInfo.videoTimingInfo) { + const {hasAudio, hasVideo, isMuxed} = this.startingMedia_; + + if (hasVideo && !segmentInfo.videoTimingInfo) { return false; } - if (this.startingMedia_.hasAudio && !segmentInfo.audioTimingInfo) { + // muxed content only relies on video timing information for now. + if (hasAudio && !this.audioDisabled_ && !isMuxed && !segmentInfo.audioTimingInfo) { return false; } } @@ -2336,8 +2339,10 @@ export default class SegmentLoader extends videojs.EventTarget { // Although transmuxing is done, appends may not yet be finished. Throw a marker // on each queue this loader is responsible for to ensure that the appends are // complete. - const waitForVideo = this.loaderType_ === 'main' && this.startingMedia_.hasVideo; - const waitForAudio = !this.audioDisabled_ && this.startingMedia_.hasAudio; + const {hasAudio, hasVideo, isMuxed} = this.startingMedia_; + const waitForVideo = this.loaderType_ === 'main' && hasVideo; + // TODO: does this break partial support for muxed content? + const waitForAudio = !this.audioDisabled_ && hasAudio && !isMuxed; segmentInfo.waitingOnAppends = 0; diff --git a/test/master-playlist-controller.test.js b/test/master-playlist-controller.test.js index eedb749e3..623c9c064 100644 --- a/test/master-playlist-controller.test.js +++ b/test/master-playlist-controller.test.js @@ -2930,7 +2930,7 @@ QUnit.test('parses codec from muxed fmp4 init segment', function(assert) { 'parsed video codec' ); assert.deepEqual(loader.startingMedia_, { - hasAudio: false, + hasAudio: true, hasVideo: true, videoCodec: 'avc1.42c00d', audioCodec: 'mp4a.40.2',