FFMPEG нажал поток RTMP, не работающий на Android и iPhone

Я должен сделать полуживой поток. Я использовал модуль 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 и iPhone, чтобы пользователи могли смотреть живой канал.

В загружаемой части у меня есть подсказка, возможно, карта ТВ-тюнера и Open Broadcast Software, чтобы передать ее на сервер. Но Live-воспроизведение для меня нова.


UPDATE: Я также использовал 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. Сейчас все работает. Но, очевидно, это не будет вариантом для всех, поэтому я не отправляю его в качестве ответа.

Solutions Collecting From Web of "FFMPEG нажал поток RTMP, не работающий на Android и iPhone"

Использование протокола RTMP очень ограничено и в основном используется для видеозаписи. Нет смысла использовать его для воспроизведения, поскольку мобильные устройства не поддерживают RTMP изначально, вы не думаете, что может быть хорошей идеей советовать мобильным пользователям установить VLC или подобное приложение на устройстве?

Плагин nginx-rtmp-module был включен в Nginx +, чтобы сделать полноценный сервер носителей записи из Nginx в качестве замены Wowza Media Server или реализовать HLS для playaback через HTTP. Этот плагин может использоваться с версией с открытым исходным кодом 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-потоковая передача , см. Пример

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

    Другая сторона – безопасность. Как защитить URL видеопотока? Предварительно созданные URL-адреса с истекшим сроком действия – хороший подход, вы можете попробовать увидеть мой пример.

  1. Ваше входное видео использует H.264 с high профилем.

    Если вам нужна совместимость с iOS и Android, вы должны использовать baseline профиль. Новые iPhones поддерживают main и high профили, но в документации на 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 создает поток 25 кадров в секунду, в то время как ffprobe видит поток 20 ffprobe в секунду.
Есть ли место на сервере, на котором установлены другие выходные параметры? Попробуйте настроить выход ffmpeg соответствующим образом.

Посмотрите, влияет ли изменение выхода ffmpeg выход сервера, и попробуйте перейти с основным профилем h264.

Что касается сообщения об ошибке ffprobe , если ваш исходный файл также содержит 3 потока, возможно, серверу это не нравится, поэтому удалите этот поток данных с помощью следующей map :
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...