HTML5直播流传输技术

92

为了学校的需要,我需要设置一个HTML5直播网站。他们一直在使用Flash流媒体播放器,但现在他们想改用HTML5。我该怎么做呢?我尝试使用video标签,但无法使其工作。以下是我拥有的代码。请问有人可以指点我正确的方向吗?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Deltion Live Streaming</title>
    <script language="javascript" type="text/javascript" src="../swfobject.js"></script>
</head>

<body>  

    <video id="movie" width="460" height="306" preload autoplay>
        <source src="rtmp://fl2.sz.xlcdn.com:80/sz=Deltion_College=lb1"  type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
            <!-- HERE THE CODE FOR THE ALTERNATIVE PLAYER (FLASH) WILL BE! -->
    </video>
</body>
</html>

1
类似于RTSP(open RTMP的继任者),可以通过https://dev59.com/_XI-5IYBdhLWcg3wqqXh了解更多信息。 - Ciro Santilli OurBigBook.com
更具限制性的问题:https://dev59.com/6WEh5IYBdhLWcg3w3muK - Ciro Santilli OurBigBook.com
8个回答

28

一个可能的替代方案:

  1. 使用编码器(例如 VLC 或 FFmpeg)将输入流打包成 OGG 格式。例如,在此情况下,我使用了 VLC 来使用以下代码打包屏幕捕获设备:

    C:\Program Files\VideoLAN\VLC\vlc.exe -I dummy screen://   :screen-fps=16.000000 :screen-caching=100   :sout=#transcode{vcodec=theo,vb=800,scale=1,width=600,height=480,acodec=mp3}:http{mux=ogg,dst=127.0.0.1:8080/desktop.ogg}   :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep

  2. 像这样将此代码嵌入到 HTML 页面的 <video> 标记中:

    <video id="video" src="http://localhost:8080/desktop.ogg" autoplay="autoplay" />

这应该可以解决问题。然而,它的性能有点差,据我所知,MP4 容器类型在浏览器中的支持应该比 OGG 更好。


1
在任何电脑上都可以正常工作。但是我无法让它在移动设备上运行(例如在Android上的Chrome浏览器中)。有什么想法吗? - Adorjan Princz
1
@AdorjanPrincz 这可能是因为Android/Chrome缺少ogg解码器。尝试使用不同的视频(和/或容器)格式。 - Zsolt
@AdorjanPrincz 这个的延迟是多少?低于1秒吗? - bilogic

25

通过使用媒体源扩展(MSE)这个相对较新的W3C标准,可以在HTML5中实现直播流: https://www.w3.org/TR/media-source/ MSE是HTML5 <video> 标签的扩展;网页上的javascript代码可以从服务器获取音频/视频片段并将它们推送到MSE进行播放。获取机制可以通过HTTP请求(MPEG-DASH)或WebSockets来完成。截至2016年9月,所有设备上的主要浏览器都支持MSE,iOS则是唯一的例外。

对于延迟较高(5秒以上)的HTML5直播视频流,您可以考虑由video.js或Wowza流媒体引擎实现的MPEG-DASH。

对于延迟较低、接近实时的HTML5直播视频流,请查看EvoStream媒体服务器、Unreal媒体服务器和WebRTC。


21
首先,您需要设置一个媒体流服务器。您可以使用Wowza、red5或nginx-rtmp-module。阅读它们的文档并在您想要的操作系统上进行设置。 所有引擎都支持HLS(由Apple开发的Http Live Stream协议)。您应该阅读配置文档。 例如,使用nginx-rtmp-module:
rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 4000;

        application show {
            live on;
            # Turn on HLS
            hls on;
            hls_path /mnt/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
            # disable consuming the stream from nginx as rtmp
            deny play all;
        }
    }
} 

server {
    listen 8080;

    location /hls {
        # Disable cache
        add_header Cache-Control no-cache;

        # CORS setup
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        add_header 'Access-Control-Allow-Headers' 'Range';

        # allow CORS preflight requests
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Headers' 'Range';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        root /mnt/;
    }
}

在服务器设置和配置成功后,您必须使用一些rtmp编码器软件(如OBS、wirecast等)来开始像YouTube或twitchtv这样的流媒体传输。
在客户端(在您的情况下是浏览器)中,您可以使用Videojs或JWplayer来为最终用户播放视频。您可以执行以下操作以使用Videojs:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Live Streaming</title>
    <link href="//vjs.zencdn.net/5.8/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.8/video.min.js"></script>
</head>
<body>
<video id="player" class="video-js vjs-default-skin" height="360" width="640" controls preload="none">
    <source src="http://localhost:8080/hls/stream.m3u8" type="application/x-mpegURL" />
</video>
<script>
    var player = videojs('#player');
</script>
</body>
</html>

您不需要添加其他插件,如flash(因为我们使用的是HLS而不是RTMP)。此播放器可以在没有flash的情况下在各种浏览器中正常工作。


您的配置文件似乎缺少服务器部分的http块。但是一般来说很难让这个流媒体业务正常运行。 - Johncl
在HTML部分,你调用了stream.m3u8,但我在服务器配置中没有看到这个名称,你从哪里得到的? - user3058963

17

8

在HTML 5中不可能使用RTMP协议,因为RTMP协议只能在服务器和flash播放器之间使用。因此,在HTML 5中观看流视频时,您可以使用其他流媒体协议。


5
其他协议是什么? - eri
2
@eri 例如 HLS - BitParser

5
你可以使用一个名为Videojs的出色库。你可以在这里找到更多有用的信息。但是通过快速启动,你可以做到像这样:
<link href="//vjs.zencdn.net/5.11/video-js.min.css" rel="stylesheet">
<script src="//vjs.zencdn.net/5.11/video.min.js"></script>
<video id="Video" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="none" width="auto"
    height="auto" poster="poster.jpg"
    data-setup='{"techOrder": ["flash", "html5", "other supported tech"], "nativeControlsForTouch": true, "controlBar": { "muteToggle": false, "volumeControl": false, "timeDivider": false, "durationDisplay": false, "progressControl": false } }'>
        <source src="rtmp://{domain_server}/{publisher}" type='rtmp/mp4' />
</video>
<script>
    var player = videojs('Video');
    player.play();
</script>

2
使用ffmpeg + ffserver。 它很有效! 您可以从ffmpeg.org获取ffserver的配置文件,并相应地设置值。

13
请发布您的命令和配置,我遇到了一些问题。 - Gustav

-12
<object classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"
            height="285" id="mediaPlayer" standby="Loading Microsoft Windows Media Player components..."
            type="application/x-oleobject" width="360" style="margin-bottom:30px;">
            <param name="fileName" value="mms://my_IP_Address:my_port" />
            <param name="animationatStart" value="true" />
            <param name="transparentatStart" value="true" />
            <param name="autoStart" value="true" />
            <param name="showControls" value="true" />
            <param name="loop" value="true" />
            <embed autosize="-1" autostart="true" bgcolor="darkblue" designtimesp="5311" displaysize="4"
                height="285" id="mediaPlayer" loop="true" name="mediaPlayer" pluginspage="http://microsoft.com/windows/mediaplayer/en/download/"
                showcontrols="true" showdisplay="0" showstatusbar="-1" showtracker="-1" src="mms://my_IP_Address:my_port"
                type="application/x-mplayer2" videoborder3d="-1" width="360"></embed>
</object>

13
仅仅给出代码的答案并不实用。如果您在每个答案中包含简短的解释,那么您将有更好的机会帮助他人(并获得赞同)。请注意,这并不意味着您需要详尽地解释每一行代码,而是提供一些背景或上下文信息,以使您的答案更加易于理解。 - trooper
3
@AsongAmagin,您漏掉了该对象元素的闭合标签。 - TylerH
2
仅限Windows,因此失去了HTML 5提供的跨平台支持。 - AlastairG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接