2015-06-02 27 views
17

Yarı canlı yayın yapmak zorundayım. Ben Nginx-rtmp modülü kullanılmış ve daha sonra kullanarak Ffmpeg aracılığı içerik itti:FFMPEG, Android ve iPhone üzerinde çalışmayan RTMP akışını itti

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

akışı ben den VLC açtığınızda daha iyi çalışır "rtmp: //rtmp.server.here"

Ama Ayrıca bu akışları çalan iPhone ve Android uygulamalarını da yapmak zorundayım. Ve sorun şu ki, akışı, Android ve iPhone'da çalışmıyor.

Wowza akış bulutunu ve kendi nginx-rtmp sunucum yerine Wowza bulutuna akış uygularsam, o zaman Android & iPhone için yazılan uygulama aynı anda akışı düzgün şekilde çalabilir.

Şimdi ya nginx-rtmp düzgün çalışmıyor, ya da başka ne var? Ben de crtmpserver denedim ve aynı şey olur. Ben modernleşmek istiyorum ne

: Bence bir web sitesi bir sunucuya bir TV Kanalını (bunun için haklara sahip) akıntıya ve ardından yapabilir bir sistem android uygulama geliştirmek zorunda & iPhone uygulaması tüketicilerin can yüzden canlı kanalı izle.

Yükleme bölümü, sunucuya akışı için bir TV tuner kartı ve Open Broadcast Software bir ipucuna sahibim. Ama Canlı oynatma benim için yeni.


GÜNCELLEME: Ben de burada ffprobe kullanılan ve çıkış var. Ben Wowza akış sunucusunun Lisanslı kopyasını kullanarak çalışan benim akışı var:

[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 

Güncelleme 2 (son satırı bakınız). Her şey şimdi çalışıyor. Ama açıkçası bu herkes için bir seçenek olmayacak çünkü bu yüzden cevap olarak göndermiyorum.

+1

Akışınız ile Wowza çıkışı arasında kodlama farklılıkları olup olmadığını kontrol etmek için 'ffprobe' kullanmayı deneyebilirsiniz. – aergistal

+0

@aergistal Cevabı ffprobe çıktısıyla güncelledim. – BlackDivine

+0

Wowza ve Nginx akışları için ffprobe çıkışını karşılaştırın –

cevap

2

RTMP protokolü kullanımı çok sınırlıdır ve öncelikli olarak video kaydı için kullanılmaktadır. Mobil cihazlar RTMP'yi yerel olarak desteklemediğinden oynatma için kullanmanın bir nedeni yok, mobil kullanıcıların cihazda VLC veya benzeri bir uygulamayı yüklemelerini tavsiye etmek iyi bir fikir değil mi? Winkza Media Server'ın yerine Nginx'ten kapsamlı bir kayıt ortamı sunucusu oluşturmak veya HTTP üzerinden playaback için HLS'yi uygulamak için Nginx + 'a eklenmiştir. Bu eklenti Nginx açık kaynak sürümü ile kullanılabilir.

HTTP (ler) üzerinden çalışmak sadece 2 seçenek, her biri sahip mobil cihazlar için video içeriği kullanılabilir hale getirmek için değil, RTMP:

  1. HTTP Live Streaming, örneğe bakın:

    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, örnek

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

    , bakınız diğer taraf güvenliktir. Video akışı URL'si nasıl korunur? Önceden oluşturulan zaman dolmuş URL'leri iyi bir yaklaşımdır, deneyebilirsiniz, örneğimi gör there.İlk

+0

Geç yanıt için özür dilerim. Şirketimdeki diğer öncelikli işlerle gerçekten meşguldüm. – BlackDivine

0

, sana dosyası (ffprobe) hakkında daha fazla ayrıntı eklemek önermek nedenle, sunucu çıkışı ile karşılaştırılabilir.
Alternatif olarak, ffmpeg komutunda daha sıkı olun ve belirli bir çıktı ayarlayın. ffprobe bir 20fps akarsu görür iken ffmpeg bir 25fps akışını oluşturur: zaten ffmpeg çıktı ve sunucu en arasında bir fark yoktur Seninle
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

son güncelleme: YouTube'a RTMP itmek için kullandıkları bir komut var
.
Sunucuda başka çıkış parametreleri ayarladığınız bir yer var mı? ffmpeg çıkışını buna göre ayarlamayı deneyin.

ffmpeg çıkışının değiştirilmesinin sunucu çıktısını etkileyip etkilemediğini görmek ve h264 ana profili ile devam etmeyi deneyin. ffprobe hata mesajı ile ilgili olarak

, orijinal dosya da 3 akarsuları, belki sunucu bu kaldırmak sevmez içeriyorsa böyle map kullanarak 'Data' akışı şu:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...

+0

"Ana" ve "yüksek" profiller daha yeni iPhone'larda desteklenirken, Android belgeleri yalnızca H.264 AVC için "taban çizgisi" profilinden bahseder. Bu nedenle, her iki platformla da uyumluluk gerekiyorsa bununla birlikte gitmeniz gerekir. Varsayılan 'aac' kodlayıcısı ** NOT ** önerilir (ipucu: '-strict-experimental' kısmı). Geçerli AAC çıkışı için en iyi seçenek 'libfdk_aac' – aergistal

1
  1. Sizin giriş videosu, high profiliyle H.264 kullanır. Eğer hem iOS uyumluluğu istiyorum ve Android Eğer

    Eğer baseline profili kullanmalıdır. Newer iPhonesmain ve high profillerini destekleyen ancak Android documentation sadece bahseder baseline:

    -c:v libx264 -profile baseline

  2. o FFmpeg'den için mevcut en yüksek kalitede kodlayıcı ve o yardımcı olacağından libfdk_aac kullanın yerli aac gibi ses codec'i kullanmayın

    -c:a libfdk_aac

  3. emin olun: Eğer geçerli AAC akışı üretmek ses hızı desteklenir. FLV video formatı sadece 11025, 22050 örnekleme oranına destekler ve 44100.

    -ar 44100

  4. ffprobe desteklenmeyen akışı Stream #0:1: Data: none göstermektedir.atlamadan map kullanın:

    -map 0:0 -map 0:2

  5. girmek gibi bir .ts dosyasını kullanırsanız (MPEG-TS için) AAC ADTS başlığını kaldırmak için emin olun:

    -bsf:a aac_adtstoasc

Örn:

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://... 
İlgili konular