|
@@ -8,12 +8,16 @@ var maxHeight = 1920;
|
|
var globalYuvPtr = undefined;
|
|
var globalYuvPtr = undefined;
|
|
var golbalYuvData;//全局,只分配一次
|
|
var golbalYuvData;//全局,只分配一次
|
|
var renderCount = 0;
|
|
var renderCount = 0;
|
|
|
|
+var curFrameWidth = undefined;
|
|
|
|
+var curFrameHeight = undefined;
|
|
|
|
+
|
|
|
|
|
|
function doSomeInit() {
|
|
function doSomeInit() {
|
|
var allocSize = maxWidth * maxHeight * 3;
|
|
var allocSize = maxWidth * maxHeight * 3;
|
|
golbalYuvData = new Uint8Array(allocSize);
|
|
golbalYuvData = new Uint8Array(allocSize);
|
|
}
|
|
}
|
|
self.importScripts("ffmpeghelper.js");
|
|
self.importScripts("ffmpeghelper.js");
|
|
|
|
+self.importScripts("spsParser.js");
|
|
|
|
|
|
self.Module.onRuntimeInitialized = function () {
|
|
self.Module.onRuntimeInitialized = function () {
|
|
isFinish = true;
|
|
isFinish = true;
|
|
@@ -31,13 +35,19 @@ self.addEventListener('message', function (e) {
|
|
var buffer = e.data.data;
|
|
var buffer = e.data.data;
|
|
|
|
|
|
if (buffer[0] !== 0xff) { // 音频解码
|
|
if (buffer[0] !== 0xff) { // 音频解码
|
|
- if (isSwitchSharpness) {
|
|
|
|
- var type = buffer[4] & 0x1f;
|
|
|
|
- if (type == 7 || type == 8) {
|
|
|
|
- console.log("视频类型:" + type);
|
|
|
|
- isSwitchSharpness = false;
|
|
|
|
- h264Queue.push(buffer);
|
|
|
|
|
|
+ var type = buffer[4] & 0x1f;
|
|
|
|
+ if (type == 7) {
|
|
|
|
+ let info = spsParser(buffer);
|
|
|
|
+
|
|
|
|
+ if (curFrameWidth != undefined && curFrameHeight != undefined) {
|
|
|
|
+ if (info.width != curFrameWidth || info.height != curFrameHeight) { // 分辨率发生改变,切换
|
|
|
|
+ switchNewStream();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ curFrameWidth = info.width;
|
|
|
|
+ curFrameHeight = info.height;
|
|
|
|
+ h264Queue.push(buffer);
|
|
} else {
|
|
} else {
|
|
h264Queue.push(buffer);
|
|
h264Queue.push(buffer);
|
|
}
|
|
}
|
|
@@ -46,11 +56,11 @@ self.addEventListener('message', function (e) {
|
|
}
|
|
}
|
|
|
|
|
|
if (msg.type == "switchSharpness") { // 分辨率切换实现
|
|
if (msg.type == "switchSharpness") { // 分辨率切换实现
|
|
- isSwitchSharpness = true;
|
|
|
|
|
|
+ /*isSwitchSharpness = true;
|
|
closeDecoder();
|
|
closeDecoder();
|
|
var ret = Module._openDecoder();//再次开启解码器
|
|
var ret = Module._openDecoder();//再次开启解码器
|
|
var timeFlag = setInterval(decodeVideo, 1);
|
|
var timeFlag = setInterval(decodeVideo, 1);
|
|
- console.log("切换解码器成功");
|
|
|
|
|
|
+ console.log("切换解码器成功");*/
|
|
}
|
|
}
|
|
}, false);
|
|
}, false);
|
|
|
|
|
|
@@ -106,11 +116,10 @@ function decodeH264(data) {
|
|
var frameHeight = 0;
|
|
var frameHeight = 0;
|
|
var inputPtr = Module._malloc(data.length); //输入数据
|
|
var inputPtr = Module._malloc(data.length); //输入数据
|
|
|
|
|
|
- for (i = 0; i < data.length; i++) {
|
|
|
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
|
|
Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
|
|
}
|
|
}
|
|
|
|
|
|
- var time = new Date().getTime();
|
|
|
|
var allocSize = maxWidth * maxHeight * 3 / 2;
|
|
var allocSize = maxWidth * maxHeight * 3 / 2;
|
|
if (globalYuvPtr == undefined) {
|
|
if (globalYuvPtr == undefined) {
|
|
globalYuvPtr = Module._malloc(allocSize);
|
|
globalYuvPtr = Module._malloc(allocSize);
|
|
@@ -118,15 +127,12 @@ function decodeH264(data) {
|
|
|
|
|
|
var ret = Module._feedData(inputPtr, data.length, globalYuvPtr);
|
|
var ret = Module._feedData(inputPtr, data.length, globalYuvPtr);
|
|
|
|
|
|
- if (ret >= 0)//解码成功才考虑渲染
|
|
|
|
- {
|
|
|
|
|
|
+ if (ret >= 0) { //解码成功才考虑渲染
|
|
frameWidth = Module._getVideoWidth();//拿到解码器宽、高
|
|
frameWidth = Module._getVideoWidth();//拿到解码器宽、高
|
|
frameHeight = Module._getVideoHeight();
|
|
frameHeight = Module._getVideoHeight();
|
|
- var curCost = new Date().getTime() - time;
|
|
|
|
var copyLen = frameWidth * frameHeight * 3 / 2;//只拷贝必须的长度
|
|
var copyLen = frameWidth * frameHeight * 3 / 2;//只拷贝必须的长度
|
|
|
|
|
|
- if (renderCount > 1)//第一帧因为画面时全绿色的不渲染
|
|
|
|
- {
|
|
|
|
|
|
+ if (renderCount > 1) { //第一帧因为画面时全绿色的不渲染
|
|
dispatchYuvData(golbalYuvData, globalYuvPtr, frameWidth, frameHeight, copyLen);
|
|
dispatchYuvData(golbalYuvData, globalYuvPtr, frameWidth, frameHeight, copyLen);
|
|
} else {
|
|
} else {
|
|
renderCount++;
|
|
renderCount++;
|
|
@@ -136,6 +142,13 @@ function decodeH264(data) {
|
|
Module._free(inputPtr);
|
|
Module._free(inputPtr);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+function switchNewStream() {
|
|
|
|
+
|
|
|
|
+ closeDecoder();
|
|
|
|
+ var ret = Module._openDecoder();//再次开启解码器
|
|
|
|
+ var timeFlag = setInterval(decodeVideo, 1);
|
|
|
|
+ console.log("切换解码器成功");
|
|
|
|
+}
|
|
|
|
|
|
function closeDecoder() {
|
|
function closeDecoder() {
|
|
clearInterval(timeFlag);//关闭原有定时器
|
|
clearInterval(timeFlag);//关闭原有定时器
|