FFMPEG推动RTMPstream不适用于Android和iPhone

我必须做一个半实况stream。 我使用Nginx的rtmp模块,然后通过使用ffmpeg推送内容:

ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here" 

当我在VLC中从“rtmp://rtmp.server.here”打开它时,stream正常运行

但是我也必须制作播放这些stream的iPhoneAndroid应用程序。 这就是问题,这个stream在Android和iPhone上不起作用。

如果我使用Wowzastream云和stream到Wowza云而不是我自己的nginx-rtmp服务器,那么为Android和iPhone编写的相同的应用程序可以播放stream就好了。

现在要么nginx-rtmp不能正常工作,或者还有其他什么? 我也试过crtmpserver,发生同样的事情。

我想要达到的目标:我必须开发一个系统,在这个系统中,我们可以将一个电video道(拥有它的权利)上传到一个服务器,然后制作一个网站,安卓应用程序和iPhone应用程序,以便消费者可以观看直播频道。

上传部分我有一个线索,可能是一个电视调谐卡和开放式广播软件stream到服务器。 但现场回放对我来说是新的。


更新:我也用ffprobe,这里的输出。 (见最后一行)

 munir@munir-HP-ProBook-450-G2:~$ ffprobe rtmp://rtmp.server.here ffprobe version 2.6.2 Copyright (c) 2007-2015 the FFmpeg developers built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab libavutil 54. 20.100 / 54. 20.100 libavcodec 56. 26.100 / 56. 26.100 libavformat 56. 25.101 / 56. 25.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 11.102 / 5. 11.102 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 [flv @ 0x267cc60] Stream discovered after head already parsed Last message repeated 1 times Input #0, flv, from 'rtmp://stage.funworldpk.com/live': Metadata: Server : NGINX RTMP (github.com/arut/nginx-rtmp-module) displayWidth : 320 displayHeight : 240 fps : 20 profile : level : Duration: 00:00:00.00, start: 288.763000, bitrate: N/A Stream #0:0: Video: h264 (High), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 20 fps, 20 tbr, 1k tbn, 40 tbc Stream #0:1: Data: none Stream #0:2: Audio: aac (LC), 22050 Hz, stereo, fltp Unsupported codec with id 0 for input stream 1 

更新2:通过使用Wowzastream媒体服务器的许可副本,我获得了我的stream。 现在一切正常。 但显然这不是每个人的select,这就是为什么我不把它作为答案。

RTMP协议的使用非常有限,主要用于视频录制。 没有理由将其用于回放,因为移动设备本身不支持RTMP,您不认为建议移动用户在设备上安装VLC或类似的应用程序是一个好主意吗?

插件nginx-rtmp-module已经被Nginx +整合到Nginx中,作为Wowza Media server的替代品,或者通过HTTP来实现HLS的playaback功能。 这个插件可以用于Nginx的开源版本。

要使您的视频内容可供移动设备使用,您只有两个选项,每个选项都可以通过HTTP(而不是RTMP)工作:

  1. HTTP直播流媒体 ,请参阅示例:

     location / { hls; hls_fragment 5s; hls_buffers 10 10m; hls_mp4_buffer_size 1m; hls_mp4_max_buffer_size 5m; root /var/video/; } 
  2. HTTP伪流 ,请参阅示例

     location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; mp4_limit_rate on; mp4_limit_rate_after 30s; } 

    另一面是安全。 如何保护视频流URL? 预生成的时间过期的URL是很好的方法,你可以试试,看看我的例子。

  1. 您的输入视频使用high配置H.264

    如果您想兼容iOS和Android ,则必须使用baseline配置文件。 较新的iPhone支持mainhigh配置文件,但Android文档仅提到了baseline

    -c:v libx264 -profile baseline

  2. 不要使用本地aac作为音频编解码器,使用libfdk_aac因为它是FFmpeg的最高质量编码器,它将帮助您生成有效的AAC流:

    -c:a libfdk_aac

  3. 确保音频速率是支持的。 FLV视频格式仅支持11025,22050和44100的采样率。

    -ar 44100

  4. ffprobe显示不支持的流Stream #0:1: Data: none 。 使用map跳过它:

    -map 0:0 -map 0:2

  5. (仅适用于MPEG-TS)如果使用.ts文件作为输入,请确保删除AAC ADTS标头:

    -bsf:a aac_adtstoasc

例如:

 ffmpeg -re -i content.mp4 -map 0:0 -map 0:2 -c:v libx264 -vprofile baseline -preset ultrafast -tune zerolatency -r 25 -pix_fmt yuv420p -c:a libfdk_aac -ac 2 -ar 44100 -f flv rtmp://... 

首先,我建议你添加更多关于文件的详细信息( ffprobe ),以便将其与服务器输出进行比较。
或者,在你的ffmpeg命令中更严格,并设置一个特定的输出。
这是我用来将RTMP推送到YouTube的命令:
ffmpeg -i any_file.mp4 -strict experimental -acodec aac -ac 1 -ar 44100 -vcodec libx264 -pix_fmt yuv420p -g 30 -vb 512k -profile:v main -preset ultrafast -r 30 -f flv -s 854x480 rtmp://a.rtmp.youtube.com/live2/your-channel.stream_code

随着你上次更新, ffmpeg输出和服务器之间已经有了一个区别: ffmpeg创建一个25fps的流,而ffprobe看到一个20fps的流。
你有没有在服务器上设置其他输出参数的地方? 尝试相应地设置ffmpeg输出。

查看是否更改ffmpeg输出会影响服务器输出,并尝试使用h264主配置文件。

关于ffprobe错误信息,如果您的原始文件也包含3个数据流,服务器可能不喜欢使用这样的map去除'Data'数据流:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...