我正在 Linux 上使用 ffmpeg 和 vlc 通过 HTTP 生成 MPEG 传输流 ( mpegts
)。基本上ffmpeg
捕获屏幕并生成 h.264
使用 mpegts
进行流式传输然后vlc
用作通过 http
传送流的服务器。这就是我设法实现这一目标的方法。
ffmpeg -f x11grab -s 1280x800 -r 30 -i :0.0+0,0 -f alsa -ac 2 -i pulse -vcodec libx264 -preset ultrafast -s 1280x800 -threads 0 -f mpegts - | vlc -I dummy - --sout '#std{access=http,mux=ts,dst=:3030}
以及一些关于生成的流的有用日志:
Output #0, mpegts, to 'pipe:':
Metadata:
encoder : Lavf57.72.101
Stream #0:0: Video: h264 (libx264), yuv444p(progressive), 1280x800, q=-1--1, 30 fps, 90k tbn, 30 tbc
Metadata:
encoder : Lavc57.96.101 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream #0:1: Audio: mp2, 48000 Hz, stereo, s16, 384 kb/s
Metadata:
encoder : Lavc57.96.101 mp2
一切看起来都不错,除了我无法在 HTML 页面中播放流。有人可以向我指出一些解决方案来在 HTML 页面中渲染流或更改流类型以使其得到渲染。 预先感谢您!
编辑:
我注意到一些奇怪的事情。 <video>
无法在 Ubuntu 的 Firefox (51.0.1) 上播放 mp4 文件(我也在带有 Chrome 的 Windows 8 上进行了测试)。
我只是使用ffmpeg
录制屏幕 10 秒并生成 .mp4 视频(见下文)。
ffmpeg -video_size 1280x800 -framerate 25 -f x11grab -i :0.0+0,0 -t 00:00:10 ~/Workspace/videostream/output.mp4
然后播放包含以下代码片段的 output.mp4 视频。
<video width="480" height="320" controls="controls">
<source src="output.mp4" type="video/mp4">
</video>
尽管我可以使用任何其他媒体播放器打开视频,但这根本无法播放。 output.mp4
的媒体信息(使用 MediaInfo,v0.7.96)文件是:
GENERAL: MPEG-4 (Base Media): 1.007 MiB, 10s 0ms; 1 Video stream: AVC; Overall bit rate: 825 Kbps; Writing application: Lavf57.72.101
VIDEO: 2 343 Kbps, 1280*800(16:10), at 25.000 fps, MPEG Video (Version 2) (Main@High 1440)
但是,如果我替换 output.mp4
与任何其他.mp4
文件,它确实可以在 Firefox 中播放。因此,这让我得出结论,这不是浏览器问题,而是我利用 ffmpeg
的方式问题。 。以下是正确的.mp4
的媒体信息文件在浏览器中成功运行。
GENERAL: MPEG-4 (Base Media/Version 2): 48.4 MiB, 2mn 50s; 1 Video stream: AVC; 1 Audio stream: AAC; Overall bit mode rate: Variable; Overall bit rate: 2 385 Kbps;
VIDEO: 2 256 Kbps, 1280*720(16:9), at 25.000 fps, AVC (<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5d103c34331d116e736c" rel="noreferrer noopener nofollow">[email protected]</a>) (CABAC / 3 Ref Frames); ISO media produced by Google Inc.
AUDIO:
126 Kbps, 44.1 KHz, 2 channels, AAC (LC), ISO media produced by Google Inc.
这是使用 ffmpeg
重定向 h.264 mpegts 流所产生的输出文件的媒体信息。命令与 -pix_fmt yuv420p ./ffmpeg -t 00:00:10 -f x11grab -s 1280x800 -r 30 -i :0.0+0,0 -pix_fmt yuv420p -vcodec libx264 -preset ultrafast -s 1280x800 -threads 0 -f mpegts - > ~/Workspace/file.ts
:
GENERAL: MPEG-TS: 2.93 MiB, 9s 960ms; 1 Video stream: MPEG Video; 1 Menu stream: MPEG Video; Overall bit rate mode: Variable; Overall bit rate: 2 465 Kbps;
VIDEO: 2 343 Kbps, 1280*800(16:10), at 25.000 fps, MPEG Video (Version 2) (Main@High 1440)
最佳答案
我认为 yuv444p 无法在 <video>
中播放任何浏览器的标记。
您可能需要一个可以输出更柔和的yuv420p平面的ffmpeg二进制文件。也许您可以将其作为选项传递给 libx264,如下所示:-pix_fmt yuv420p
.
编辑: 这对我有用:
"C:\Program Files\VideoLAN\VLC\vlc.exe" screen:// :screen-fps=25 :screen-caching=5000 :sout=#transcode{vcodec=theo,vb=800,scale=1,width=800,height=600,acodec=none}:http{mux=ogg,dst=:8181/desktop} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep
唯一的缺点似乎是性能。很慢。也许这是 VLC 的 Windows 版本特有的,希望它在 Linux 上表现更好。另外,尝试其他编解码器/容器组合,我不知道 Theora 是否是编码桌面捕获的合适选择。
在 Chrome (Windows) 中测试
<video controls>
<source src="http://127.0.0.1:8181/desktop">
</video>
注意:您不必使用本地主机,VLC 会监听
TCP 0.0.0.0:8181
关于video - 在html页面中播放h.264视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44483508/