ffmpeg - 将图像流转换为 H.264 实时视频流的过程是什么?
问题描述
使用任何协议/编解码器的实时流如何从端到端工作?
我一直在搜索 google、youtube、FFMPEG 文档、OBS 源代码、堆栈溢出,但仍然无法从视频中了解实时视频流的工作原理。因此,我正在尝试捕获桌面屏幕截图并将其转换为 H.264 编码的实时视频流。
我知道该怎么做:
- 在某个循环上使用带有 C# 的 Graphics.CopyFromScreen 捕获屏幕截图图像
- 对位进行编码并将图像保存为 JPEG 文件
- 一次发送一个 base64 格式的 JPEG 图像并将其写入命名管道服务器
- 从 nodejs 服务器上的命名管道读取图像缓冲区
通过套接字将base64 jpeg图像发送到客户端以显示在网页上,每一帧
我想能够做什么:
- 使用其中一种协议(RTMP、RTSP、HLS、DASH)将块、图像编码为某种 H.264 格式以进行实时流式传输
- 将编码的视频块连续推送到服务器(例如 RTMP 服务器)(我假设 1-2 秒?)
- 从客户端访问服务器以流式传输和显示实时视频
我尝试使用 FFMPEG 将 .mp4 文件连续发送到 RTMP 服务器,但这似乎不起作用,因为它会在每个视频后关闭连接。我也研究过使用 ffmpeg concat 列表,但这只是结合了视频,它不能将直播读取的视频附加到我的理解范围内,并且可能不是为此而制作的。
所以我最好的线索来自这个stackoverflow的答案,它建议:
- 在 FLV 容器中编码,将持续时间设置为任意长(根据答案,youtube 使用了这种方法)
- 使用 ffmpeg 或其他开源 rtmp 多路复用器将流编码为 RTMP
- 将流转换为 HLS
这种编码和转换是如何完成的?这一切都可以用 ffmpeg 命令完成吗?
解决方案
推荐阅读
- php - 在 OpenSuse 上使用 Nginx 和 PHP-FPM 提供内联 PHP
- google-cloud-storage - 在 python 客户端中批量删除对象的指数退避
- python - 使用 pexpect 自动化 IP 验证
- .net - 部署到 IIS 时无法运行 CrystalReports
- r - 使用带有“From”变量的 sqldf 时,result_create 出错
- batch-file - 用于复制 txt 文档中列出的文件并保留重复文件的批处理脚本
- python - 尝试使用 datetime 让 Python 程序在特定时间执行任务但它不工作,没有错误输出
- c++ - 通用 lambdas 和二进制大小/代码膨胀
- ios - 无效的 WatchKit 支持 - Xcode 10 - iOS 12
- python - 匹配和删除文件中的字符串