附加块时如何修复 CHUNK_DEMUXER_ERROR_APPEND_FAILED 错误?
How to fix CHUNK_DEMUXER_ERROR_APPEND_FAILED error when append chunk?
我想创建一个可以播放多种分辨率的视频播放器,所以我必须加载不同编解码器的块。
我尝试附加同一编解码器的块,但它起作用了。所以我尝试使用 changeType() 但是当我在视频元素中附加新的编解码器块时我发现了这个错误 "CHUNK_DEMUXER_ERROR_APPEND_FAILED: Append: stream parsing failed.".
const myMediaSource = new MediaSource();
var videoSourceBuffer;
var quality=480,qlast=480;
var currentSegment = 0;
var loading = false;
function videos() {
myMediaSource.addEventListener('sourceopen', sourceOpen, { once: true});
}
function sourceOpen() {
setInterval(feedVideo, 500);
}
function feedVideo() {
if (!loading) {
try {
if (myMediaSource.sourceBuffers.length == 0) {
videoSourceBuffer = myMediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E,mp4a.40.2"');
appendSegment("cinit.mp4", 0);
first = true;
} else {
if (qlast != quality) {
videoSourceBuffer = myMediaSource.sourceBuffers[0];
if (quality == 1080) {
type = 'video/mp4; codecs="avc1.640028,mp4a.40.2"';
}
else if (quality == 720) {
type = 'video/mp4; codecs="avc1.64001F,mp4a.40.2"';
}
else if (quality == 480) {
type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
}
else if (quality == 360) {
type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
}
videoSourceBuffer.changeType(type);
videoSourceBuffer.mode = "segments";
qlast = quality;
}
}
if (!first) {
appendSegment("c" + currentSegment + ".m4s", currentSegment);
}
else {
first = false;
}
} catch (error) {
console.log('Error! ' + error);
}
}
}
function appendSegment(file, resourcesIndex) {
loading = true;
fetch("http://mysite/video/" + quality + "p/" + file).then(function (response) {
return response.arrayBuffer();
}).then(function (videoData) {
videoSourceBuffer.appendBuffer(videoData);
videoSourceBuffer.addEventListener('updateend', function () {
loading = false;
}, { once: true });
});
}
我该如何解决?
您几乎可以肯定不需要在这里使用 changeType
,因为它通常用于更改编解码器(例如 avc -> hevc)或容器(例如 mp4 -> webm),而您只是在同一编解码器和容器内切换。
问题几乎可以肯定是您没有在质量更改上附加初始化段 - 您只为第一个质量级别执行此操作。
修复:在每个新质量的第一个媒体片段之前插入适当的初始化片段。
我想创建一个可以播放多种分辨率的视频播放器,所以我必须加载不同编解码器的块。
我尝试附加同一编解码器的块,但它起作用了。所以我尝试使用 changeType() 但是当我在视频元素中附加新的编解码器块时我发现了这个错误 "CHUNK_DEMUXER_ERROR_APPEND_FAILED: Append: stream parsing failed.".
const myMediaSource = new MediaSource();
var videoSourceBuffer;
var quality=480,qlast=480;
var currentSegment = 0;
var loading = false;
function videos() {
myMediaSource.addEventListener('sourceopen', sourceOpen, { once: true});
}
function sourceOpen() {
setInterval(feedVideo, 500);
}
function feedVideo() {
if (!loading) {
try {
if (myMediaSource.sourceBuffers.length == 0) {
videoSourceBuffer = myMediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E,mp4a.40.2"');
appendSegment("cinit.mp4", 0);
first = true;
} else {
if (qlast != quality) {
videoSourceBuffer = myMediaSource.sourceBuffers[0];
if (quality == 1080) {
type = 'video/mp4; codecs="avc1.640028,mp4a.40.2"';
}
else if (quality == 720) {
type = 'video/mp4; codecs="avc1.64001F,mp4a.40.2"';
}
else if (quality == 480) {
type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
}
else if (quality == 360) {
type = 'video/mp4; codecs="avc1.64001E,mp4a.40.2"';
}
videoSourceBuffer.changeType(type);
videoSourceBuffer.mode = "segments";
qlast = quality;
}
}
if (!first) {
appendSegment("c" + currentSegment + ".m4s", currentSegment);
}
else {
first = false;
}
} catch (error) {
console.log('Error! ' + error);
}
}
}
function appendSegment(file, resourcesIndex) {
loading = true;
fetch("http://mysite/video/" + quality + "p/" + file).then(function (response) {
return response.arrayBuffer();
}).then(function (videoData) {
videoSourceBuffer.appendBuffer(videoData);
videoSourceBuffer.addEventListener('updateend', function () {
loading = false;
}, { once: true });
});
}
我该如何解决?
您几乎可以肯定不需要在这里使用 changeType
,因为它通常用于更改编解码器(例如 avc -> hevc)或容器(例如 mp4 -> webm),而您只是在同一编解码器和容器内切换。
问题几乎可以肯定是您没有在质量更改上附加初始化段 - 您只为第一个质量级别执行此操作。
修复:在每个新质量的第一个媒体片段之前插入适当的初始化片段。