一开始就简短些。
我通过 nginx 配置使用 avconv 通过 rtmp 进行流式传输。据我所知,只有通过 flash 才能将该流捕获到网站上。如今,通过智能手机(iPhone/Android/任何设备)播放 flash 文件是一件很糟糕的事情。我想要做的是,抓取该流(以 rtmp 形式传入)并将其转换为 HTML5 可播放文件/流。我知道 dash on; 或 hls on; 的可能性,但它并不是真正完美地工作。(我必须打开 CORS,才能让这个该死的东西启动并运行,但它仍然会卡顿)
这是我的设置:
avconv:
avconv \
-f video4linux2 -input_format mjpeg -r 10 -s hd720 -i /dev/video0 \
-f video4linux2 -input_format mjpeg -r 10 -s 640x480 -i /dev/video1 \
-vf transpose=cclock -filter_complex \
"[0:v]scale=1280:-1,setpts=PTS-STARTPTS[bg]; \
[1:v]scale=320:-1,transpose=cclock,setpts=PTS-STARTPTS[fg]; \
[bg][fg]overlay=W-w-10:10[out]" \
-map "[out]" -vprofile baseline -vcodec libx264 -preset fast \
-maxrate 3000k -bufsize 6000k -b 500k \
-f flv rtmp://STREAMURL
nginx.conf:
rtmp {
server {
listen 1935;
chunk_size 4096;
application webcam {
live on;
record off;
allow publish a.b.c.d;
deny publish all;
allow play all;
#exec /usr/bin/avconv -loglevel verbose -i rtmp://STREAMURL -vcodec libx264 -vprofile baseline /tmp/out.mp4;
} } }
注释行生成了一个输出文件,该文件会随时间而增大。在某些配置下,这可能没问题,但对于 24/7 不间断的流,我猜这不是一个好的解决方案。
谁有什么好主意或提示可以解决我的问题: - 获取 rtmp 流,将其转换为仅缓存而不保存到硬盘的 HTML5 可播放文件。
答案1
我个人会使用 Icecast 服务器并从 avconv 提供数据。但作为 Icecast 维护者,我还是有点偏见。
它可以解决文件增长的问题,因为 Icecast 仅在内存中保留一个小的(可配置)缓冲区,并且默认情况下不会写入任何文件。还请注意,您应该将关键帧间隔保持在相当短的范围内。这样浏览器就不会有问题,可以锁定初始数据中最接近的关键帧。
我也会使用 WebM 而不是 h.264,但这是我对非专有编解码器的偏好。如果使用 WebM,我会将关键帧比率保持在 1:10-1:15 以下。
话虽如此,HLS 或 DASH 可能是值得探索的替代方案。Avconv 有一种 HLS 输出模式,但可能需要一些额外的脚本来清理过时的块。