使用 ffmpeg 和 nginx 实时流式传输 .webm 文件

Posted

技术标签:

【中文标题】使用 ffmpeg 和 nginx 实时流式传输 .webm 文件【英文标题】:Live streaming .webm file with ffmpeg and nginx 【发布时间】:2017-12-08 09:03:46 【问题描述】:

您好,我是ffmpeg 的新手,我需要一些关于.webm 文件的实时流媒体帮助,该文件仍在写入中。我有一个 .webm 文件,其中仅包含 vp9 编解码器which needs to be live streamed (preferably without transcoding and streamed using DASH 中的视频。我已经使用以下配置编译了 nginx 以及来自 (https://github.com/arut/nginx-ts-module#features) 的 nginx-ts-module

nginx version: nginx/1.12.1
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/home/ubuntu/NGINX/nginx-ts-module-master

媒体文件具有以下属性(通过 mediainfo 获得):

General
Complete name                            : video_4_1_Admin_0.webm
Format                                   : WebM
Format version                           : Version 2
File size                                : 19.7 MiB
Duration                                 : 1ms
Overall bit rate                         : 165 Gbps
Writing library                          : libwebm-0.2.1.0
Video
ID                                       : 1
Format                                   : VP9
Codec ID                                 : V_VP9
Width                                    : 320 pixels
Height                                   : 180 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Variable
Language                                 : English
Default                                  : Yes
Forced                                   : No

我正在尝试使用以下内容流式传输文件

ffmpeg -re -i video_4_1_Admin_0.webm -bsf:v vp9_superframe -c copy -f webm_chunk  http://127.0.0.1:8000/publish/sintel

我收到以下错误

Input #0, matroska,webm, from 'video_4_1_Admin_0.webm':
  Metadata:
    encoder         : libwebm-0.2.1.0
  Duration: 00:00:00.00, start: 0.000000, bitrate: 174444152 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv), 320x180, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Output #0, webm_chunk, to 'http://127.0.0.1:8000/publish/sintel':
Output file #0 does not contain any stream

我不确定传递给ffmpeg 的确切选项是什么,以便它创建.mpd 和允许我直播媒体所需的块,我尝试替换示例中给出的选项(@ 987654322@) 与 vp9 等效。但是,我不确定。有人可以帮我吗?提前致谢

【问题讨论】:

Hey@seekahead 请以正确的格式发布问题。 感谢@Allan 的编辑 【参考方案1】:

WebM 不是 MPEG-TS。

Nginx 不适合您的用例。您可以改用 Icecast。

【讨论】:

感谢布拉德的回复。尽管我可以向 nginx 本身添加新模块以支持流式传输,但我将无法引入新的媒体服务器。有一篇文章wiki.webmproject.org/adaptive-streaming/… 建议如何从相机实时流式传输视频,但不确定如何设置从文件流式传输。并且文章说任何支持 NGINX 这样做的 DASH 的“网络服务器”,认为它应该是可能的。 如果你想使用 DASH,那是独立于服务器的。您必须将文件与 Nginx 分开写入服务器。

以上是关于使用 ffmpeg 和 nginx 实时流式传输 .webm 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ffmpeg 将实时 m3u8 文件流式传输到 youtube rtmp

将麦克风从客户端浏览器流式传输到远程服务器,并将音频实时传递到 ffmpeg 以与第二个视频源结合

ffmpeg exec命令未在nginx rtmp中运行

ffmpeg 将 rtsp 重新流式传输到 mjpeg

使用 ffmpeg 将低延迟 RTSP 视频流式传输到 android

使用 ffmpeg 在文件夹中流式传输视频