FFMPEG推动RTMP流无法在Android&苹果手机

时间:2015-06-02 07:44:21

标签: android iphone nginx ffmpeg rtmp

我必须制作半直播。我使用了Nginx-rtmp模块,然后使用:

通过ffmpeg将内容推送到它
ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here"

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

但我还必须制作播放这些流的iPhone和Android应用程序。 这就是问题,该流在Android和iPhone上无效。

如果我使用Wowza流式云并流式传输到Wowza云而不是我自己的nginx-rtmp服务器,那么为Android& iPhone可以很好地播放流。

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

我想要实现的目标: 我必须开发一个系统,我们可以上传电视频道(拥有它的权利)到服务器,然后建立一个网站,android app& iPhone应用程序,以便消费者可以观看直播频道。

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

更新:我还使用了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: 我使用Wowza流媒体服务器的许可副本让我的流工作。现在一切都有效。但显然这对每个人来说都不是一个选择,这就是为什么我不把它作为答案发布。

3 个答案:

答案 0 :(得分:3)

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

插件nginx-rtmp-module已合并到Nginx +,以便从Nginx中创建一个综合录制媒体服务器,作为Wowza媒体服务器的替代品,或通过HTTP实现HLS播放游戏。这个插件可以与Nginx开源版一起使用。

要使您的视频内容可供移动设备使用,您只有2个选项,每个选项都通过HTTP(而非RTMP)运行:

  1. HTTP Live Streaming,请参阅示例:

    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 pseudo streaming,请参阅示例

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

    另一方面是安全。如何保护视频流媒体网址?预先生成的过期网址是一种很好的方法,您可以尝试查看我的示例there

答案 1 :(得分:1)

  1. 您的输入视频使用H.264high个人资料。

    如果您希望与 iOS和Android 兼容,则必须使用baseline个人资料。 Newer iPhones支持mainhigh个人资料,但Android documentation仅提及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

  6. 例如:

    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://...
    

答案 2 :(得分:0)

首先,我建议您添加有关该文件的更多详细信息(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删除该“数据”流,如下所示:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...