使用video.js是否可以获取当前的HLS时间戳?

时间:2019-03-08 09:54:18

标签: video.js hls

我有一个将实时流嵌入其中的应用程序。为了应付延迟,我想知道流的当前时间戳是多少,并将其与服务器上的时间进行比较。

到目前为止,我所测试的是检查视频的缓冲时间与视频的当前时间之间的时差:

player.bufferedEnd() - player.currentTime()

但是,我想与服务器比较时间,并且这样做,我需要获取最后请求的.ts文件的时间戳。

所以,我的问题是使用video.js,是否有某种挂钩来获取最后请求的.ts文件的时间戳?

Video.js版本:7.4.1

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题,但是请耐心等待,我不记得我在哪里找到了这段代码的文档。

就我在Angular应用程序中工作而言,我有一个视频组件负责使用video.js加载实时流。无论如何,让我们看一些代码...

视频初始化

private videoInit() {
    this.player = videojs('video', {
        aspectRatio: this.videoStream.aspectRatio,
        controls: true,
        autoplay: false,
        muted: true,
        html5: {
            hls: {
                overrideNative: true
            }
        }
    });

    this.player.src({
        src: '://some-stream-url.com',
        type: 'application/x-mpegURL'
    });

    // on video play callback
    this.player.on('play', () => {
        this.saveHlsObject();
    });
}

保存HLS对象

private saveHlsObject() {
    if (this.player !== undefined) {
        this.playerHls = (this.player.tech() as any).hls;

        // get and syncing server time...
        // make some request to get server time...
        // then calculate difference...
        this.diff = serverTime.getTime() - this.getVideoTime().getTime();
    }
}

获取视频片段的时间戳

// access the player's playlists, get the last segment and extract time
// in my case URI of segments were for example: 1590763989033.ts
private getVideoTime(): Date {
    const targetMedia = this.playerHls.playlists.media();

    const lastSegment = targetMedia.segments[0];

    const uri: string = lastSegment.uri;
    const segmentTimestamp: number = +uri.substring(0, uri.length - 3);

    return new Date(segmentTimestamp);
}

因此,重点是getVideoTime函数。可以在段URI中找到段的时间,因此该函数从段URI中提取时间,然后将其转换为Date对象。现在说实话,我不知道此URI格式是HLS的标准还是为我要连接的特定流设置的。希望能对您有所帮助,对不起,我没有更多具体信息!