Skip to content

Commit

Permalink
fix(flv/MainParser): 解决flv连续seek导致的视频播放错误
Browse files Browse the repository at this point in the history
fix #10
  • Loading branch information
fuyuhao committed Jun 26, 2018
1 parent 3b1c26a commit 07beb39
Show file tree
Hide file tree
Showing 13 changed files with 2,308 additions and 662 deletions.
Binary file removed .DS_Store
Binary file not shown.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ typings/

#lerna-changelog
.changelog

#editor workspace file
.idea/
7 changes: 5 additions & 2 deletions examples/flv/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@
var player = new Player({
id: 'vs',
url: './xgplayer-demo.flv',
poster: './poster.png'
//在线地址
// url: 'http://yunxianchang.live.ujne7.com/vod-system-bj/TLaf2cc9d469939803949187b46da16c45.flv',
poster: './poster.png',
// preloadTime: 20,
})
</script>

<!-- 或者 -->
<!-- <script src="../../packages/xgplayer-flv.js/browser/xgplayer-flvjs.js" charset="utf-8"></script>
<script type="text/javascript">
Expand Down
16 changes: 12 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,24 @@
"dash"
],
"lint-staged": {
"src/**/*.js": [
"eslint -c .eslintrc --fix",
"git add"
]
"linters": {
"packages/**/*.js": [
"eslint -c .eslintrc.js --fix",
"git add"
]
},
"ignore": ["**/browser/*.js", "**/dist/*.js"]
},
"author": "yinguohui@bytedance.com",
"license": "MIT",
"bugs": {
"url": "https://github.com/bytedance/xgplayer/issues"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"homepage": "https://github.com/bytedance/xgplayer#readme",
"dependencies": {}
}
748 changes: 747 additions & 1 deletion packages/xgplayer-flv/browser/xgplayer-flv.js

Large diffs are not rendered by default.

759 changes: 758 additions & 1 deletion packages/xgplayer-flv/dist/index.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions packages/xgplayer-flv/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prepare": "npm run build",
"dev": "webpack --progress --display-chunks --watch --config ./webpack.config.dev.js",
"build": "webpack --progress --display-chunks -p",
"watch": "webpack --progress --display-chunks -p --watch"
},
Expand Down
167 changes: 83 additions & 84 deletions packages/xgplayer-flv/src/index.js
Original file line number Diff line number Diff line change
@@ -1,79 +1,79 @@
import MainParser from './parse/MainParser';
import Player from 'xgplayer';
import MSE from './parse/MSE';
import VodTask from './utils/VodTask';
import defaultConfig from './constants/config';
import MainParser from './parse/MainParser'
import Player from 'xgplayer'
import MSE from './parse/MSE'
import VodTask from './utils/VodTask'
import defaultConfig from './constants/config'

const isEnded = function (player, flv) {
if (flv.videoDuration - player.currentTime * flv.videoTimeScale < 2 * flv.videoTimeScale) {
const range = player.getBufferedRange();
const range = player.getBufferedRange()
if (player.currentTime - range[1] < 0.1) {
player.mse.endOfStream();
player.mse.endOfStream()
}
}
};
let tempCurrentTime = 0;
}
let tempCurrentTime = 0
const flvPlayer = function () {
let player = this,
flv,
mse,
seekDataReceived,
requestSending = false,
_config = Object.assign(defaultConfig, player.config),
sniffer = Player.sniffer;
const { preloadTime, minCachedTime, isLive } = _config;
let player = this
let flv
let mse
let seekDataReceived
let requestSending = false
let _config = Object.assign(defaultConfig, player.config)
// let sniffer = Player.sniffer
const { preloadTime, minCachedTime, isLive } = _config

function progressChecker() {
const range = player.getBufferedRange();
if (flv.videoDuration - range[1] * flv.videoTimeScale < 0.1 * flv.videoTimeScale) { return; }
function progressChecker () {
const range = player.getBufferedRange()
if (flv.videoDuration - range[1] * flv.videoTimeScale < 0.1 * flv.videoTimeScale) { return }
if (range[1] - player.currentTime < minCachedTime && !requestSending) {
requestSending = true;
requestSending = true
flv.loadSegments(true, player.currentTime, preloadTime).then(() => {
requestSending = false;
});
requestSending = false
})
}
}

const _start = player.start;
const _start = player.start
player.start = function (url = _config.url) {
if (!url) { return; }
flv = new MainParser(_config, player);
if (!url) { return }
flv = new MainParser(_config, player)

flv.on('ready', (ftyp_moov) => {
mse = player.mse = flv.mse = new MSE();
_start.call(player, mse.url);
flv.on('ready', (ftypMoov) => {
mse = player.mse = flv.mse = new MSE()
_start.call(player, mse.url)

mse.on('sourceopen', () => {
flv.isSourceOpen = true;
mse.appendBuffer(ftyp_moov.buffer);
flv.isSourceOpen = true
mse.appendBuffer(ftypMoov.buffer)
mse.on('updateend', () => {
const { pendingFragments, hasPendingFragments } = flv;
const { pendingFragments, hasPendingFragments } = flv

seekDataReceived = true;
seekDataReceived = true
if (hasPendingFragments) {
const fragment = pendingFragments.shift();
const fragment = pendingFragments.shift()
if (!mse.appendBuffer(fragment.data)) {
pendingFragments.unshift(fragment);
pendingFragments.unshift(fragment)
} else {
player.emit('cacheupdate', player);
player.emit('cacheupdate', player)
}
}
});
});
})
})

mse.on('error', (e) => {
player.emit('error', e);
});
});
player.emit('error', e)
})
})

flv.handleError = function (e) {
player.emit('error', e);
};
};
player.emit('error', e)
}
}

player.on('pause', () => {
!isLive && VodTask.clear();
});
!isLive && VodTask.clear()
})
//
// player.on('resume', function () {
//
Expand All @@ -83,67 +83,66 @@ const flvPlayer = function () {
// console.log('waiting');
// });


if (!isLive) {
player.on('seeking', () => {
VodTask.clear();
const { buffered, currentTime } = player;
let isBuffered = false;
VodTask.clear()
const { buffered, currentTime } = player
let isBuffered = false
if (buffered.length) {
for (let i = 0, len = buffered.length; i < len; i++) {
if (currentTime > buffered.start(i) && currentTime < buffered.end(i)) {
isBuffered = true;
break;
isBuffered = true
break
}
}
}
if (isBuffered) {
return;
return
}
if (!flv.isSeekable) {
player.currentTime = tempCurrentTime;
return;
player.currentTime = tempCurrentTime
return
}
flv.seek(player.currentTime, preloadTime, player);
seekDataReceived = false;
});
flv.seek(player.currentTime, preloadTime, player)
seekDataReceived = false
})
player.on('timeupdate', () => {
tempCurrentTime = player.currentTime;
tempCurrentTime = player.currentTime
if (seekDataReceived !== false) {
progressChecker();
progressChecker()
}
isEnded(player, flv);
});
player.beforeReplay = function () {
VodTask.clear();
const mse = flv.mse = new MSE();
flv.replay();
isEnded(player, flv)
})
player._replay = function () {
VodTask.clear()
const mse = flv.mse = new MSE()
flv.replay()
mse.on('sourceopen', () => {
flv.isSourceOpen = true;
mse.appendBuffer(flv.ftyp_moof.buffer);
flv.isSourceOpen = true
mse.appendBuffer(flv.ftyp_moof.buffer)
mse.on('updateend', () => {
const { pendingFragments, hasPendingFragments } = flv;
seekDataReceived = true;
const { pendingFragments, hasPendingFragments } = flv
seekDataReceived = true
if (hasPendingFragments) {
const fragment = pendingFragments.shift();
const fragment = pendingFragments.shift()
if (!mse.appendBuffer(fragment.data)) {
pendingFragments.unshift(fragment);
pendingFragments.unshift(fragment)
} else {
player.emit('cacheupdate', player);
player.emit('cacheupdate', player)
}
}
});
});
})
})

mse.on('error', (e) => {
player.emit('error', e);
});
player.emit('cacheupdate', player);
player.src = mse.url;
player.mse = mse;
return true;
};
player.emit('error', e)
})
player.emit('cacheupdate', player)
player.src = mse.url
player.mse = mse
return true
}
}
};
}

Player.install('flvplayer', flvPlayer);
Player.install('flvplayer', flvPlayer)
Loading

0 comments on commit 07beb39

Please sign in to comment.