微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

hls无法使用videojs播放m3u8播放列表

如何解决hls无法使用videojs播放m3u8播放列表

我用ffmpeg从yuv帧创建了hls流,效果似乎很好。它会创建一个播放列表,并按预期更新该播放列表以及所有.ts文件。但是,即使videojs也拒绝播放它,而且我真的没什么主意,可能会错过显而易见的内容

首先,不断更新的m3u8列表:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:190
#EXTINF:2.000000,test190.ts
#EXTINF:2.000000,test191.ts
#EXTINF:2.000000,test192.ts
#EXTINF:2.000000,test193.ts
#EXTINF:2.000000,test194.ts

这些.ts文件存在,并且大小约为250 KB。 然后,我打开此标准videojs html文件(位于同一目录中):

<!DOCTYPE html>
<html>
<head>
<Meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>

  <link href="video-js.css" rel="stylesheet">
</head>
<body>
  <h1>VSTream</h1>

  <video-js id="my_video_1" class="vjs-default-skin" controls preload="auto" width="640" height="268">
    <source src="test.m3u8" type="application/x-mpegURL">
  </video-js>
  
  <script src="video.min.js"></script>
  <script src="videojs-http-streaming.min.js"></script>
  
  <script>
    var player = videojs('my_video_1');
  </script>
  
</body>
</html>

我在Firefox(或Chrome或Edge,均无法使用)中打开它,并使用其调试器,该调试器在控制台中显示

VIDEOJS:警告:已经存在一个名为“ reloadSourceOnError”的插件。 您可能要避免重新注册插件! video.min.js:12:977 不是“ application / x-mpegURL”的指定“类型”属性 支持的。加载媒体资源test.m3u8失败。 vstream.html全部 候选资源加载失败。媒体加载已暂停。 vstream.html XML分析错误:语法错误位置:file:/// C:/test/test.m3u8 行号1,列1:2 test.m3u8:1:1 MouseEvent.mozPressure是 不推荐使用。请改用PointerEvent.pressure。 video.min.js:12:9031 VIDEOJS:错误:(CODE:3 MEDIA_ERR_DECODE)播放无法继续。没有 可用的工作或支持的播放列表。对象{代码:3,消息: “无法继续播放。无法使用或支持 播放列表。”} video.min.js:12:977

这对我来说没有多大意义。为什么它会为m3u8文件引发XML解析错误?当然,MEDIA_ERR_DECODE指向某个方向,但是fMP4文件仍然存在相同的问题。

相关的ffmpeg c ++代码(格式为“ hls”,formatContext在其他情况下效果很好,gop为2):

    AVDictionary* options = 0;
    if (fragmented)
    {
        // type
        if (codecID == AV_CODEC_ID_H264)
            av_dict_set (&options,"hls_segment_type","fmp4",0);
        else
            av_dict_set (&options,"mpegts",0);

        av_dict_set (&options,"hls_time","2.0",0);
        av_dict_set_int (&options,"hls_list_size",5,0);
        av_dict_set (&options,"hls_flags","delete_segments",0);
    }

    int ret = avformat_write_header (formatContext,&options);

...返回成功。然后写框架

    int ret = avcodec_send_frame (videoStream->codecContext,frame);
    av_init_packet (avPacket);
    AVRational timeBase = videoStream->getTimeBase ();
    avPacket->stream_index = streams.indexOf (videoStream);
    ret = avcodec_receive_packet (videoStream->codecContext,avPacket);
    avPacket->duration = av_rescale_q (1,videoStream->codecContext->time_base,videoStream->getTimeBase ());
    pts += avPacket->duration;
    avPacket->pts = pts;
    avPacket->dts = pts;    //  AV_nopTS_VALUE;
    ret = av_interleaved_write_frame (formatContext,avPacket);

(此处的videoStream是表示avstream的内部对象)。 为了清楚起见,我省略了错误检查。所有返回值均显示成功。 感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。