将图像流转换为H.264实时视频流的过程是什么?

问题描述 投票:1回答:1

使用任何协议/编解码器的实时流媒体如何从端到端工作?

我一直在搜索google,youtube,FFMPEG文档,OBS源代码,堆栈溢出,但仍然无法从视频中了解实时视频流的工作方式。因此,我试图捕获桌面屏幕截图,并将其转换为H.264编码的实时视频流。

我知道该怎么办:

  1. [在某些循环上使用带有C#的Graphics.CopyFromScreen捕获屏幕快照图像
  2. 对位进行编码并将图像另存为JPEG文件
  3. 一次发送base64中的JPEG图像并将其写入命名管道服务器中
  4. 从nodejs服务器上的命名管道读取图像缓冲区
  5. 通过套接字将base64 jpeg图像发送到客户端以显示在网页上,每一帧

我想做的事:

  1. 编码,我假设将块,图像转换成某种H.264格式,以便使用其中一种协议(RTMP,RTSP,HLS,DASH)进行实时流传输
  2. 连续将编码的视频块推送到服务器(例如RTMP服务器)上(我假设是1-2秒?)
  3. 从客户端访问服务器以流式传输和显示实况视频

我曾尝试使用FFMPEG将.mp4文件连续发送到RTMP服务器上,但这似乎不起作用,因为它会在每个视频后关闭连接。我也研究过使用ffmpeg concat列表,但这只是结合了视频,无法将实时流读取的视频附加到我的理解中,并且可能不是为此而制作的。

所以我最好的线索来自this stackoverflow answer,它表明:

  1. 在FLV容器中编码,将持续时间设置为任意长(根据答案,youtube使用了此方法)
  2. 使用ffmpeg或其他开源rtmp多路复用器将流编码为RTMP
  3. 将流转换为HLS

此编码和转换如何完成?可以使用ffmpeg命令完成所有操作吗?

ffmpeg video-streaming h.264 http-live-streaming rtmp
1个回答
0
投票

自您提到C#以来,MediaFoundation将是最适合您的解决方案。

您可以检查我的sample(经过全面测试),它基于桌面复制进行桌面捕获。 该示例使用媒体基础将帧编码为H264,并使用Live555实时直播包装在RTP中的输出视频。通过这种方法,我能够达到100FPS。 Live555还支持RTSP,HLS和MPEG。

您还可以检查this one,它基于GDI方法进行桌面捕获。并且h264编码的视频以MPEG容器格式流式传输。

这里有一些其他参考链接。

  1. https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test_encoder.cc
  2. DXGI Desktop Duplication: encoding frames to send them over the network
  3. Getting green screen in ffplay: Streaming desktop (DirectX surface) as H264 video over RTP stream using Live555
  4. Intel graphics hardware H264 MFT ProcessInput call fails after feeding few input samples, the same works fine with Nvidia hardware MFT
  5. Color conversion from DXGI_FORMAT_B8G8R8A8_UNORM to NV12 in GPU using DirectX11 pixel shaders
  6. GOP setting is not honored by Intel H264 hardware MFT
  7. Encoding a D3D Surface obtained through Desktop Duplication using Media Foundation
© www.soinside.com 2019 - 2024. All rights reserved.