Подтвердить что ты не робот

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-воспроизведение для меня нова.


ОБНОВЛЕНИЕ: Я также использовал ffprobe и здесь вывод. (См. Последнюю строку)

[email protected]:~$ 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. Сейчас все работает. Но, очевидно, это не будет выбором для всех, почему я не отправляю его в качестве ответа.

4b9b3361

Ответ 1

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

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

Чтобы сделать ваш видеоконтент доступным для мобильных устройств, у вас есть только 2 варианта, каждый из которых работает через HTTP (ы), а не RTMP:

  • 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/;
    }
    
  • HTTP-потоковая передача, см. пример

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

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

Ответ 2

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

    Если вам нужна совместимость с iOS и Android, вы должны использовать профиль baseline. Новые iPhone поддерживают профили main и high, но Android-документация упоминает baseline:

    -c:v libx264 -profile baseline

  • Не используйте собственный aac как аудиокодек, используйте libfdk_aac, так как это самый высококачественный кодировщик, доступный для FFmpeg, и это поможет вам создать допустимый поток AAC:

    -c:a libfdk_aac

  • Убедитесь, что скорость звука поддерживается. Видеоформат FLV поддерживает только частоты дискретизации 11025, 22050 и 44100.

    -ar 44100

  • ffprobe показывает неподдерживаемый поток Stream #0:1: Data: none. Используйте map, чтобы пропустить его:

    -map 0:0 -map 0:2

  • (только для 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://...

Ответ 3

Сначала я предлагаю вам добавить более подробную информацию о файле (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 видит поток 20fps.
Есть ли место на сервере, на котором установлены другие выходные параметры? попробуйте установить выход ffmpeg соответственно.

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

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