nic*_*kGR 0 streaming video-streaming live-streaming
所以现在有一段时间我正在考虑创建某种视频流应用程序(客户端和服务器).进行一些小搜索我总是得到流媒体应用程序,而不是如何编写代码.
我知道它应该是......捕获数据,打包,发送到服务器,然后服务器将广播给任何连接的人......对吗?
那么我应该从哪里开始...我应该研究套接字......我应该研究更多关于如何实现UDT或TCP协议......还是那两个组合?
Bra*_*rad 11
您在搜索中遇到的部分问题是您还没有真正定义您要解决的问题."视频流应用"还不够......有哪些限制?一些有助于缩小适当解决方案的问题:
我知道它应该是......捕获数据,打包,发送到服务器,然后服务器将广播给任何连接的人......对吗?
关.让我们稍微分解一下.所有视频流都将具有捕获,编解码器,容器或传输,要分发的服务器以及连接到服务器并反转整个过程的客户端的一些元素.
正如我在上面暗示的那样,你如何做到这一点取决于你所在的平台.这实际上是变化最大的地方.如果你在Windows上,那就是DirectShow.OSX和Linux有自己的捕获框架.还记得你需要和音频流,这不一定在视频捕获中处理.如果您是基于网络的,则需要getUserMedia.
发送原始未压缩帧会非常低效.如果不是编解码器,我们就知道视频流是不可能的.每个编解码器的工作方式都有所不同,但有很多常用技术.
在基本层面上,如果你可以想象幻灯片上的帧,每一帧与下一帧没有太大的不同.对于给定的镜头,可能会发生运动,但帧中的大部分内容保持非常相似.我们只需发送更改后的内容即可节省大量带宽.(实际上,由于我们捕获的世界的模拟性质,每个帧总是有点不同,但编解码器可以在几乎完全相同的事物上花费很少的带宽,而不是完全不同的事物.)当我们进行不同的镜头时,编解码器会看到整个帧不同并发送整个帧.可以独立的框架是"I帧".每隔几秒钟,I帧也会定期插入流中.大多数视频播放器只会寻找I帧,因为任何不是I帧的都需要在它之前解码所有帧直到前一帧.如果你曾试图在电影中找到一个确切的位置,但是玩家会在几秒钟内将你带到某个地方,这就是为什么会发生这种情况.此外,如果某些帧被破坏,流将在下一个I帧上自行校正.(曾经看过一段视频,其中很大一部分都变绿了几秒钟,但之后还不错?这就是原因.)
视频编解码器还利用了我们如何看待事物的本质.我们的眼睛对亮度的变化比对颜色的变化更敏感.因此,编解码器在帧中的亮度差异上比在色差中花费更多的带宽.还有一些狡猾的技巧,用于平滑和增加视觉噪音,使事物看起来更正常而不是块状.
音频编解码器也是必需的.虽然CD质量的立体声未压缩音频流可能只占用1.4mbit,但在互联网方面这是一个很大的带宽.很多流视频网站使用的带宽比整个视频少.与视频编解码器非常相似的音频编解码器在我们如何看待节省带宽方面使用了一些技巧.(有关更详细的说明,请阅读有关MP3如何工作的帖子:https: //sound.stackexchange.com/a/25946/7209)
下一步是以容器格式将编码的音频和视频流复用在一起.如果您正在录制到磁盘,您可以选择类似MKV的内容,它们支持音频,视频,字幕等,所有这些都在同一个文件中.WebM基本上是MKV的限制版本,但设计为浏览器易于支持.或者您可以选择像MP4那样复杂的格式,您可以选择音频和视频编解码器,但可以获得更好的播放器兼容性.
由于您是实时流式传输,因此流式传输协议和容器之间的界限通常会模糊不清.HLS将要求您制作一堆独立的视频文件,但您的复用程序和编解码器需要知道如何以可以再次组合在一起的方式对这些文件进行分段.我认为RTMP从FLV中获取线索,但在与客户端的交换中也有一些关于流的信息.(如果您使用RTMP,您可能会在其他地方阅读它...我对引擎盖下的RTMP知之甚少.)
这里有很多选择.在WebRTC的情况下,"服务器"实际上可能是执行所有编码的Web浏览器,而不是因为它可以运行点对点.或者,您可能有一个运行RTMP的专用流服务器,或者用于分发HLS块的普通HTTP Web服务器.同样,您选择的内容取决于您的要求.
客户端需要连接到服务器,对流进行解复用,解码音频和视频流,然后播放它们.这是上面列出的整个过程,但反之亦然.
那么我应该从哪里开始......
搞清楚启动正是你想做的事.如果您不知道自己想做什么,请使用WebRTC.浏览器完成所有工作,在大多数情况下它只需要很少的服务器资源.这将允许您实时在几个客户端之间进行流式传输.
为了获得更高级的功能,请开始尝试现有的已有产品.FFmpeg是一个很棒的工具,您应该完全知道如何使用它,它可以嵌入您的解决方案中.
您可能不应该做的一些事情(除非您真的想要):
我应该研究套接字.我应该研究更多关于如何实现UDT或TCP协议......还是那两个组合?
了解网络基础知识总是有帮助的.是的,了解UD P和TCP肯定会对您有所帮助,但由于您没有发明自己的流媒体协议,所以无论如何都不会在它们之间进行选择.
我希望这可以帮助你开始.简而言之,了解这里的所有图层.完成后,您将知道下一步该做什么,以及Google应该做些什么.