实时视频或音频流如何工作?

Posted

技术标签:

【中文标题】实时视频或音频流如何工作?【英文标题】:How live video or audio streams work? 【发布时间】:2015-11-14 15:05:13 【问题描述】:

我对生成 html 页面的服务器进行编码,以便用户可以在浏览器中查看这些页面。

它有 onGetRequest 事件,这是它的处理程序:

            var req = e.Request;
            var res = e.Response;

            var path = req.RawUrl.Replace("%20", " ");
            if (path == "/")
                path += "index.html";

            if (path.Contains("/../"))
            
                res.StatusCode = (int)HttpStatusCode.Forbidden;
                return;
            

            var content = this.ServerToRun.GetFile(path); //getting file to read
            if (content == null)
            
                res.StatusCode = (int)HttpStatusCode.NotFound;
                return;
            

            string extension = path.Substring(path.LastIndexOf('.'));

            string auto_mime = PageControls.MimeTypeDeterminer.GetMimeTypeFor(extension);

            if (string.IsNullOrEmpty(auto_mime))
            
                if (extension.Length > 1)
                    res.ContentType = "application/" + extension.Substring(1);
                else
                    res.ContentType = "application/unknown";
            
            else
                res.ContentType = auto_mime;

            if (path.EndsWith(".html") || path.EndsWith(".htm"))
                res.ContentEncoding = Encoding.UTF8;

            res.WriteContent(content); //sending content to client

我不明白要支持直播需要做什么。 例如,我可以从麦克风录制音频,所以文件会每秒增加它的大小。

我可以在 html 代码中做到这一点:

<audio>
    <source src = "live.wav" type = "audio/wav" />
</audio>

服务器将接收对该文件的查询,将其读取到最后并将其发送给客户端,但在此之后live.wav 将获得更多的声音块,服务器将不再发送给客户端。

所以,我被困住了,直播是如何工作的,我需要做什么?

我为每个客户端都打开了 WebSocket,所以我可以调用一些脚本。

【问题讨论】:

尝试使用&lt;audio controls&gt;...&lt;/audio&gt; @Æðelstan - 这对我有什么帮助?它会让浏览器不断请求音频文件还是什么?我虽然这个属性只添加了控制面板。 这只是尝试,但您也可以尝试使用不同的文件格式。尝试得到广泛支持的 mp3。并非所有浏览器都正确支持相同的音频格式。看看这个问题:***.com/questions/10404005/… @Æðelstan - 我想你不明白我在问什么,因为using a different file format 与我的问题完全无关。 HTML5 确实支持音频标签上的直播,所以问题肯定出在其他地方。 【参考方案1】:

您应该使用Transfer-Encoding: Chunked HTTP 标头。此标头允许您以块的形式发送数据而无需指定 Content-Length,因此客户端不会关闭套接字,直到服务器指示已发送最后一个块。见https://en.wikipedia.org/wiki/Chunked_transfer_encoding。

【讨论】:

以上是关于实时视频或音频流如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

ExoPlayer 无法播放 Adob​​e 实时流编码器流式传输的音频/视频 (RTMP)

实时消息协议流的所有可能容器

Android/iOS:通过流混合改善实时流媒体体验

Android/iOS:通过流混合改善实时流媒体体验

如何通过浏览器从网络摄像头获取实时流视频详细信息到 python?

从 iPhone 到另一台设备(浏览器或 iPhone)的实时音频/视频流