ffmpeg - 在 Web 平台上使用 ffmpeg 运行本地用户的实时流式传输
问题描述
我正在使用以下命令来流式传输我的实时桌面屏幕。
ffmpeg -f x11grab -r 1 -loglevel panic -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -i $DISPLAY -qscale 0 -f mpegts udp://192.168.3.151:1111
udp://192.168.3.151:1111 - 这是我的流媒体 URL
我可以在假释媒体播放器中看到直播(在 Linux 平台上),但我在跨网络中看不到这个(即来自 windows PC - 在同一个网络中)
是否有任何网络平台,所以我可以使用唯一的流媒体 URL 从任何地方(Windows 或 linux)查看我的流媒体,还是我需要更改我的流媒体命令或方法?
任何帮助深表感谢
解决方案
我假设 192.168.3.151 是您的 linux 机器 IP,并且使用提到的 URL (udp://192.168.200.151:1111),您正在本地机器的端口 1111 上进行流式传输,因此预计只能在其上看到此流。
首先,您可以使用多播 UDP 范围(在此处查看更多信息)将您的桌面屏幕流式传输到本地 LAN,如下所示:
ffmpeg -f x11grab -r 1 -loglevel panic -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -i $DISPLAY -qscale 0 -f mpegts udp://239.0.0.1:1111
因此,您可以在本地 LAN 中的其他机器上看到流。
如果您想在网络上流式传输您的桌面屏幕,您必须使用适当的编解码器,如 h264 (MP4),并使用Nginx、Wowza或类似的媒体服务器,并使用以下命令在其上流式传输:
ffmpeg -f x11grab -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -framerate 25 -i $DISPLAY -c:v h264 -preset ultrafast -tune zerolatency -qscale 0 -f mpegts rtmp://<Media_Server_Address>:1935/live/<stream_name>
Media_Server_Address是您的服务器域或 IP 地址。这可以是您的 Web 服务器或安装了媒体服务器的其他服务器。
live是一个处理实时流的应用程序。它可以有另一个名称,但默认情况下它的默认名称是 live。
stream_name是流的任意名称。
在这种情况下,您通过媒体服务器上的RTMP发送流,然后其他人可以通过例如HLS协议通过 VLC 播放器等播放器应用程序或通过具有此 URL 的网页中的 HTML5 视频标签看到它:
http://<Media_Server_Address>:1935/live/<stream_name>/playlist.m3u8
更新:
这是使用 Nginx 作为媒体服务器的示例:
Nginx 配置:
worker_processes 1;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
allow publish all;
allow play all;
}
}
}
FFmpeg 命令必须在本地 PC 上执行才能将本地 PC 的桌面流式传输到媒体服务器:
ffmpeg -f x11grab -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -framerate 25 -i $DISPLAY -c:v h264 -preset ultrafast -qscale 0 -f flv rtmp://<Media_Server_Address>:1935/live/localdesktop
现在,用户可以通过此 URL 在其他 PC 上使用 VLC 播放流:
rtmp://<Media_Server_Address>/live/localdesktop
如果需要 HLS 播放,只需将 hls 配置添加到 Nginx 配置文件中即可。然后用户可以使用 VLC 使用这个 URL 来播放 hls 流:
http://<Media_Server_Address>:1935/live/localdesktop/playlist.m3u8
需要注意的是,在这种情况下,必须使用相同的 ffmpeg 命令。
推荐阅读
- webassembly - 如何在不手动检查的情况下找出网站是否使用 webassembly?
- python - SQLAlchemy 过滤器用于具有多个需求的多对多关系
- flutter - 内部监听 Provider
- javascript - 我需要编写一个循环,对 console.log 进行七次调用以输出以下倒三角形?
- java - 哪种 JDBC 批量删除策略最适合性能?
- reactjs - 如何使用 Local-Npm 在本地安装包
- react-native - 不变违规:requireNativeComponent:在 UIManager 中找不到“RNCSafeAreaProvider”
- matplotlib - matplotlib 中的热图网格
- javascript - 我如何解码代码?
- c++ - Opengl 问题:很可能是简单的纹理问题