我正在使用HTML5 Media source extensions (MSE)使用DASH流式传输视频。我使用MP4Box从MP4文件创建了我的媒体片段,其中包含两个视频轨道。所以我所拥有的是一个包含moov->sidx
框的单个初始化细分和包含两个视频轨道的多个媒体细分moof->mdat
。如果我将它们推送到具有appendBuffer
功能的sourceBuffer
,MSE将解码并仅显示第一个视频轨道(我假设第二个视频轨道中的数据刚刚被丢弃)。
以下是我的代码中的相关部分:
sourceBuffer = mediaSource.addSourceBuffer(stats.mimeType); // mime type: video/mp4
...
// after downloading mediasegment append its contents 'data' to sourceBuffer
sourceBuffer.appendBuffer(new Uint8Array(data));
所以我的问题是,是否可以控制sourceBuffer,以便客户端可以选择要解码的轨道?我认为将视频轨道分成不同的自适应集(创建单独的mp4文件,每个单独的视频轨道)可能是一个解决方案,但我对这种方法不感兴趣。
谢谢你们。
答案 0 :(得分:3)
好的,我找到了一种方法。使用videoTracks属性,我们可以访问视频曲目并更改其selected属性。所以这很简单。
以下是如何在下载第三段后切换曲目的示例:
if(segmentCnt==3 && sourceBuffer.videoTracks.length == 2)
{
console.log('tracks cnt: ' + sourceBuffer.videoTracks.length);
for(var i=0; i<sourceBuffer.videoTracks.length; i=i+1) {
var trackID = sourceBuffer.videoTracks[i].id;
var trackSelected = sourceBuffer.videoTracks[i].selected;
console.log('trackID: ' + trackID + ' selected: ' + trackSelected);
sourceBuffer.videoTracks[i].selected = !trackSelected;
}
}