无法在Next.js中播放HLS 13

vm0i2vca  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(139)

我只想用video.js播放一个简单的HLS流。首先,我用以下代码创建了一个简单的HTML文件:

<head>
  <link href="https://vjs.zencdn.net/8.3.0/video-js.css" rel="stylesheet" />

</head>

<body>
  <video
    id="my-video"
    class="video-js"
    controls
    preload="auto"
    width="640"
    height="264"
    poster="MY_VIDEO_POSTER.jpg"
    data-setup="{}"
  >
    <source src="https://ntv1.akamaized.net/hls/live/2014075/NASA-NTV1-HLS/master_500.m3u8" type="application/x-mpegurl" />
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a
      web browser that
      <a href="https://videojs.com/html5-video-support/" target="_blank"
        >supports HTML5 video</a
      >
    </p>
  </video>

  <script src="https://vjs.zencdn.net/8.3.0/video.min.js"></script>
</body>

如果您将上面的代码复制并粘贴到HTML中,并在浏览器上打开该静态文件,它将很好地播放NASA流。
然而,当我尝试在我的NextJS应用程序上播放相同的URL时,我得到以下错误:

GET https://ntv1.akamaized.net/hls/live/2014075/NASA-NTV1-HLS/master_500.m3u8 403 (Forbidden)

我使用Next.JS 13,并尝试在客户端渲染播放器组件。但是,我还是犯了同样的错误。下面是我的视频播放器组件:

'use client';
  import videojs from 'video.js';
  import 'video.js/dist/video-js.css';
  import 'videojs-contrib-hls';
  import { useRef, useEffect } from 'react';

  const MyVideoPlayer = () => {
    const videoRef = useRef<any>(null);

    useEffect(() => {
      if (typeof window !== 'undefined') {
        // Code to run on the client-side
        const player = videojs(videoRef.current);
        player.src({
          src: 'https://ntv1.akamaized.net/hls/live/2014075/NASA-NTV1-HLS/master_500.m3u8',
          type: 'application/x-mpegURL',
        });
      }

      return () => {
        if (videoRef.current) {
          videojs(videoRef.current).dispose();
        }
      };
    }, []);

    return (
      <div data-vjs-player>
        <video ref={videoRef} className='video-js'></video>
      </div>
    );
  };

  export default MyVideoPlayer;

这是我的页面. tsx代码:

'use client';
import React from 'react';
import MyVideoPlayer from '../videoPlayer';
export default function PlayerPage() {
  const playerRef = React.useRef(null);

  return (
    <>
      <h1>Welcome to the player page</h1>
      <MyVideoPlayer />
    </>
  );
}

我做错了什么?

qq24tv8q

qq24tv8q1#

你在这里得到的错误,“403禁止”,意味着你被拒绝访问HLS流URL。这主要是一个客户端设置问题,可能由于各种原因而发生,例如身份验证、地理阻塞或流服务器上的IP限制。因此,要解决问题,我建议您尝试以下操作:

  • 再次检查HLS流URL是否正确且可访问。使用不同的框架尝试它,以确保服务器身份验证可能不是主要问题。
    *跨域资源共享(CORS)限制可能会阻止您的Next.js应用访问HLS流URL。确保托管HLS流的服务器允许来自您的域的跨域请求。您可以检查服务器的响应头以确认CORS是否已启用。或者,您可以尝试不同的内容交付网络(CDN),如Cloudinary,它可以帮助您克服任何CORS或IP限制,并确保您的流媒体播放体验更流畅。
  • Next.js主要是为服务器端渲染而设计的,在客户端渲染视频播放器有时会导致HLS流出现问题。相反,您可以尝试在服务器端呈现包含视频播放器组件的页面。但是,我无法找到Akamai CDN的任何相关文档,可以帮助您解决此问题。因此,我建议尝试不同的CDN,例如Cloudinary,它支持HLS和MPEG-DASH自适应流。你可以看看他们的streaming documentation
  • 最后,虽然Video.js是视频播放的热门选择,但您也可以考虑使用更适合您需求的其他HLS库。例如,您可以尝试使用hls.js,这是一个专门为HLS播放设计的JavaScript库。如果您正在使用Cloudinary进行HLS流媒体,那么您也可以使用Cloudinary视频播放器。

相关问题