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

时间:2019-11-24 16:24:20

标签: ffmpeg video-streaming h.264 http-live-streaming rtmp

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

我一直在搜索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命令完成所有操作吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您需要屏幕截图,则可以使用任何编解码器-H.264,HEVC或mJPEG

基于平台选择输入界面-如v4l2或dshow

通过下面的链接了解特定流方案的cmd用法。

RTMP / RTSP流

[ffmpeg] [1]-https://trac.ffmpeg.org/wiki/StreamingGuide

HLS / DASH流

[mp4Box] [1]-https://gpac.wp.imt.fr/mp4box/

注意:对于HLS / DASH流,您需要设置HTTP服务器-nginx,IIS或Apache服务器。