2015-06-02 11 views
17

पर काम नहीं कर रहे आरटीएमपी स्ट्रीम को धक्का दिया है मुझे सेमी-लाइव-स्ट्रीम बनाना है। मैं Nginx-RTMP मॉड्यूल इस्तेमाल किया और फिर का उपयोग कर ffmpeg के माध्यम से इसे करने के लिए सामग्री धक्का दिया:एफएफएमपीईजी ने एंड्रॉइड और आईफोन

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

धारा ठीक चलता है जब मैं से वीएलसी में खोलने "RTMP: //rtmp.server.here"

लेकिन मुझे आईफोन और एंड्रॉइड ऐप भी बनाना है जो इन धाराओं को खेलते हैं। और यह समस्या है, स्ट्रीम एंड्रॉइड और आईफोन पर काम नहीं करती है।

यदि मैं अपने स्वयं के nginx-rtmp सर्वर की बजाय वाहजा स्ट्रीमिंग क्लाउड और Wowza क्लाउड पर स्ट्रीम करता हूं तो एंड्रॉइड & आईफोन के लिए लिखा गया एक ही ऐप स्ट्रीम को ठीक से प्लेबैक कर सकता है।

अब या तो nginx-rtmp सही काम नहीं कर रहा है, या और क्या? मैंने crtmpserver भी कोशिश की है और वही बात होती है।

क्या मैं प्राप्त करना चाहते हैं: मैं एक प्रणाली जहां हम एक सर्वर के लिए एक टीवी चैनल (इसके लिए अधिकार है) अपस्ट्रीम और तो कर सकते हैं एक वेबसाइट, Android एप्लिकेशन विकसित करने के लिए है & iPhone ऐप्लिकेशन इसलिए उपभोक्ताओं कर सकते हैं लाइव चैनल देखें।

अपलोडिंग भाग में मुझे सर्वर पर स्ट्रीम करने के लिए शायद एक टीवी ट्यूनर कार्ड और ओपन ब्रॉडकास्ट सॉफ्टवेयर का एक सुराग है। लेकिन लाइव प्लेबैक मेरे लिए नया है।


अद्यतन: मैं भी 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 स्ट्रीमिंग सर्वर का लाइसेंस प्रतिलिपि का उपयोग करके काम कर मेरी धारा मिला है। सब कुछ अब काम करता है। लेकिन जाहिर है यह हर किसी के लिए एक विकल्प नहीं होगा इसलिए मैं इसे उत्तर के रूप में पोस्ट नहीं कर रहा हूं।

+1

आप अपनी स्ट्रीम और Wowza आउटपुट के बीच एन्कोडिंग अंतर हैं या नहीं, यह जांचने के लिए आप 'ffprobe' का उपयोग करने का प्रयास कर सकते हैं। – aergistal

+0

@Aergistal मैंने ffprobe आउटपुट के साथ उत्तर अद्यतन किया है। – BlackDivine

+0

Wowza और Nginx धाराओं के लिए 'ffprobe' आउटपुट की तुलना करें –

उत्तर

2

आरटीएमपी प्रोटोकॉल उपयोग बहुत सीमित है और मुख्य रूप से वीडियो रिकॉर्डिंग के लिए उपयोग किया जा रहा है। प्लेबैक के लिए इसका उपयोग करने का कोई कारण नहीं है क्योंकि मोबाइल डिवाइस मूल रूप से आरटीएमपी का समर्थन नहीं करते हैं, आपको नहीं लगता कि मोबाइल उपयोगकर्ताओं को डिवाइस पर वीएलसी या इसी तरह के ऐप को स्थापित करने के लिए सलाह देना अच्छा विचार हो सकता है?

प्लगइन nginx-rtmp-module को निगेंक्स + में एक व्यापक रिकॉर्डिंग मीडिया सर्वर को Wginza मीडिया सर्वर के प्रतिस्थापन के रूप में या HTTP के माध्यम से प्लेबैक के लिए एचएलएस लागू करने के लिए एनजिनक्स से बाहर करने के लिए शामिल किया गया है। इस प्लगइन का उपयोग Nginx ओपन सोर्स संस्करण के साथ किया जा सकता है।

HTTP (रों) के माध्यम से काम करते हैं अपने वीडियो सामग्री आप केवल 2 विकल्प होते हैं, उनमें से प्रत्येक की है मोबाइल उपकरणों के लिए उपलब्ध कराने के लिए, नहीं 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 देखें।

+0

मैंने प्रश्न को अद्यतन किया है, देर से उत्तर के लिए खेद है। मैं वास्तव में अपनी कंपनी में पहले शीर्ष प्राथमिकता के काम में व्यस्त था। – BlackDivine

0

पहले, मैं आप फ़ाइल (ffprobe) के बारे में अधिक विवरण जोड़ने का सुझाव तो यह सर्वर उत्पादन के साथ तुलना में किया जा सकता है।
वैकल्पिक रूप से, अपने ffmpeg कमांड में अधिक सख्त रहें और एक विशिष्ट आउटपुट सेट करें।
एक कमांड मैं यूट्यूब के लिए RTMP पुश करने के लिए उपयोग करते हैं यही कारण है कि:
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 जबकि ffprobe एक 20fps धारा देखता है एक 25fps धारा पैदा करता है।
क्या आपके द्वारा अन्य आउटपुट पैरामीटर सेट करने वाले सर्वर में कोई जगह है? तदनुसार ffmpeg आउटपुट सेट करने का प्रयास करें।

देखें कि ffmpeg आउटपुट को बदलने से सर्वर आउटपुट प्रभावित होता है, और h264 मुख्य प्रोफ़ाइल के साथ जाने का प्रयास करें।

ffprobe त्रुटि संदेश के बारे में

, अपनी मूल फ़ाइल भी 3 धाराओं, शायद सर्वर पसंद नहीं है यह इतना हटाने शामिल है कि 'डाटा' धारा इस तरह map का उपयोग कर:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...

+0

जबकि नए आईफोन पर 'मुख्य' और 'उच्च' प्रोफाइल समर्थित हैं, एंड्रॉइड प्रलेखन केवल H.264 एवीसी के लिए 'बेसलाइन' प्रोफ़ाइल का उल्लेख करता है, इसलिए यदि आपको दोनों प्लेटफार्मों के साथ संगतता की आवश्यकता है तो आपको इसके साथ जाना होगा। डिफ़ॉल्ट 'एएसी' एन्कोडर ** नहीं ** अनुशंसित है (संकेत: '-स्ट्रिक्ट-प्रयोगात्मक' भाग)। वैध एएसी आउटपुट के लिए सबसे अच्छा विकल्प 'libfdk_aac' है – aergistal

1
  1. आपका इनपुट वीडियो H.264high प्रोफ़ाइल के साथ उपयोग करता है।

    आप और दोनों आईओएस के साथ संगतता चाहते एंड्रॉयड यदि आप baseline प्रोफ़ाइल उपयोग करना चाहिए। Newer iPhonesmain और high प्रोफ़ाइल का समर्थन लेकिन Android documentation केवल उल्लेख है baseline:

    -c:v libx264 -profile baseline

  2. देशी aac ऑडियो के रूप में कोडेक का उपयोग न करें, libfdk_aac का उपयोग के बाद से यह उच्चतम गुणवत्ता FFmpeg के लिए उपलब्ध एनकोडर है और यह मदद मिलेगी

    -c:a libfdk_aac

  3. सुनिश्चित करें: आप एक वैध एएसी धारा का उत्पादन ऑडियो दर suported है। FLV वीडियो प्रारूप केवल 11025, 22050 के नमूना दर का समर्थन करता है, और 44100.

    -ar 44100

  4. ffprobe एक असमर्थित धारा Stream #0:1: Data: none को दर्शाता है।उसे छोड़ना map का उपयोग करें:

    -map 0:0 -map 0:2

  5. (एमपीईजी टीएस केवल) आप इनपुट के रूप में एक .ts फ़ाइल का उपयोग करते हैं एएसी 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://... 
संबंधित मुद्दे