首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FFMPEG推动RTMP流不能在Android和iPhone上工作。

FFMPEG推动RTMP流不能在Android和iPhone上工作。
EN

Stack Overflow用户
提问于 2015-06-02 07:44:21
回答 3查看 4.3K关注 0票数 17

我得做个半活的小溪。我使用了Nginx模块,然后通过ffmpeg将内容推送到它:

代码语言:javascript
运行
复制
ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here"

当我在VLC中从"rtmp://rtmp.server.here“打开它时,该流运行良好。

但我也必须制作iPhone和安卓应用程序来播放这些流。这就是问题所在,这个流不能在安卓和iPhone上运行。

如果我使用Wowza流云和流到Wowza云,而不是我自己的nginx服务器,那么为Android & iPhone编写的同一个应用程序可以很好地播放该流。

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

我想要的是:我必须开发一个系统,我们可以在一个电视频道上游(对它有权利)到服务器,然后制作一个网站,安卓应用程序和iPhone应用程序,这样消费者就可以观看直播频道。

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

更新:--我也使用了ff探头--这是输出。(见最后一行)

代码语言:javascript
运行
复制
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: --我通过使用working的许可副本实现了流的工作。现在一切都正常了。但很明显,这不会是每个人的选择,这就是为什么我不把它作为一个答案。

EN

回答 3

Stack Overflow用户

发布于 2015-07-11 19:55:09

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

插件nginx-rtmp-模块已经整合到Nginx+中,用Nginx作为Wowza的替代品,或者通过HTTP为播放包实现HLS。这个插件可以与Nginx开源版本一起使用。

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

  1. HTTP Live流,参见示例: 位置/{ hls;hls_fragment 5s;hls_buffers 10 10m;hls_mp4_buffer_size 1m;hls_mp4_max_buffer_size 5m;root /var/视频/;}
  2. HTTP伪流,请参阅示例 位置/视频/{ mp4;mp4_buffer_size 1m;mp4_max_buffer_size 5m;mp4_limit_rate on;mp4_limit_rate_after 30;} 另一边是保安。如何保护视频流URL?预先生成的时间过期的URL是很好的方法,你可以试试,看我的例子那里.
票数 2
EN

Stack Overflow用户

发布于 2015-07-17 09:25:48

  1. 您的输入视频使用H.264high配置文件。 如果您希望与兼容iOS和安卓,则必须使用baseline配置文件。更新的iPhones支持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文件作为输入,请确保删除ADTS头: -bsf:a aac_adtstoasc

例:

代码语言:javascript
运行
复制
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://...
票数 1
EN

Stack Overflow用户

发布于 2015-07-17 07:24:11

首先,我建议您添加更多关于该文件(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创建了一个25 the流,而ffprobe看到了一个20 the流。

在服务器中是否有设置其他输出参数的位置?尝试相应地设置ffmpeg输出。

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

关于ffprobe错误消息,如果原始文件也包含3个流,那么服务器可能不喜欢它,所以使用map删除“数据”流,如下所示:

ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30590234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档