2012-07-25 32 views
17

ffmpeg इनपुट या आउटपुट के रूप में आरटीएमपी स्ट्रीमिंग को संभालती है, और यह अच्छी तरह से काम कर रही है, तो लगातार वीडियो फ़ाइलों को स्ट्रीम करने के लिए FFMPEG का उपयोग करना।एक आरटीएमपी सर्वर

मैं कुछ वीडियो (एक पाइथन स्क्रिप्ट द्वारा प्रबंधित एक गतिशील प्लेलिस्ट) को एक आरटीएमपी सर्वर पर स्ट्रीम करना चाहता हूं, और मैं वर्तमान में कुछ सरल कर रहा हूं: आरटीएमपीईजी के साथ एफएफएमपीईजी के साथ अपने वीडियो स्ट्रीमिंग करना, हालांकि यह हर बार वीडियो समाप्त होने पर कनेक्शन ब्रेक का कारण बनता है, और अगली वीडियो शुरू होने पर स्ट्रीम जाने के लिए तैयार होती है।

मैं उन वीडियो को बिना किसी कनेक्शन ब्रेक के स्ट्रीम करना चाहता हूं, फिर स्ट्रीम को सही ढंग से देखा जा सकता है।

मैं इस आदेश का उपयोग सर्वर

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \ 
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \ 
"rtmp://mystreamingserver/app/streamName" 

मैं कई दिनों तक इंटरनेट पर कुछ समाधान के लिए देखा करने के लिए एक के बाद अपने वीडियो स्ट्रीम करने के लिए एक है, और मैंने पाया कुछ लोगों को इनपुट के रूप में एक नामित पाइप का उपयोग कर के बारे में बात ffmpeg में, मैंने कोशिश की है और यह अच्छी तरह से काम नहीं कर रहा है क्योंकि ffmpeg न केवल एक नया वीडियो आता है, बल्कि आरटीएमपी स्ट्रीम को बंद करता है बल्कि खुद को बंद कर देता है।

क्या ऐसा करने का कोई तरीका है? (कनेक्शन टूट के बिना RTMP सर्वर से ffmpeg साथ वीडियो की एक गतिशील प्लेलिस्ट स्ट्रीम

+1

नामित पाइप का उपयोग करना सही तरीका है। क्या आप विस्तार कर सकते हैं कि यह आपके लिए कैसे काम नहीं करता? – blahdiblah

+0

@blahdiblah मैंने ffmpeg में एक इनपुट के रूप में नामित पाइप का उपयोग किया, ffmpeg रोकें और पाइप से कुछ डेटा की प्रतीक्षा करें, फिर मैंने 'cat video.mp4> fifo' और ffmpeg को स्ट्रीमिंग शुरू करने और वीडियो स्ट्रीम करने के बाद छोड़ दिया है। मुझे लगता है कि मैं नहीं जानता कि नामित पाइप का सही तरीके से उपयोग कैसे किया जाए, जब मैंने 'cat video1.mp4 video2.mp4> फीफो 'ffmpeg त्रुटि' स्ट्रीम 4, ऑफ़सेट 0x1d83c: आंशिक फ़ाइल 'को पहले वीडियो स्ट्रीम करने के बाद दिखाया। मुझे पता है कि यह मुझे गलत कर रहा है, मुझे वीडियो डेटा को पाइप के माध्यम से उचित तरीके से पास करना होगा। – KKetch

+1

मैं प्रत्येक वीडियो के लिए एक पाइप (ex vid1.mp4 -> पाइप 1, vid2.mp4 -> पाइप 2 आदि) का उपयोग कर वीडियो की एक स्थिर प्लेलिस्ट स्ट्रीम करने में कामयाब रहा। फिर मैं पाइप "स्ट्रीम" नामक एक ही स्ट्रीम में लिखता हूं, इस तरह 'बिल्ली पाइप 1 पाइप 2 पाइप 3> स्ट्रीम', और मैं अपनी स्ट्रीम प्रकाशित करने के लिए एफएफएमपीईजी में इनपुट के रूप में स्ट्रीम पाइप का उपयोग करता हूं, लेकिन जब से मैं एक गतिशील प्लेलिस्ट की तलाश करता हूं ** कैसे कर सकते हैं स्ट्रीम को जीवित रखने के लिए मैं "स्ट्रीम" पाइप पर और वीडियो भेजता हूं? ** मुझे अभी तक इसका पता नहीं लगा है। (नोट, पहले वीडियो को छोड़कर, मुझे यह काम करने के लिए पूंछ कमांड का उपयोग करके प्रत्येक वीडियो फ़ाइल के मेटाडेटा को काटना पड़ा) – KKetch

उत्तर

6

अद्यतन (जैसा कि मैंने स्वीकार कर लिया जवाब नहीं हटा सकते हैं): उचित समाधान एक कस्टम demuxer, concat के समान लागू करने के लिए है। वर्तमान में कोई अन्य स्वच्छ रास्ता नहीं है। आप अपने हाथ गंदे और कोड प्राप्त करने के

नीचे एक बदसूरत हैक। यह एक बहुत ही बुरा तरीका यह करने के लिए है बस नहीं है!,!

समाधान कॉन्सट डेमक्सर का उपयोग करता है और आपके सभी स्रोत मीडिया फ़ाइल मानता है एक ही कोडेक का उपयोग करें। उदाहरण एमपीईजी-टीएस पर आधारित है लेकिन आरटीएमपी के लिए भी ऐसा किया जा सकता है।

  1. निम्न स्वरूप के साथ गतिशील प्लेलिस्ट आप के लिए प्रवेश द्वारों की एक बड़ी सूची पकड़े एक प्लेलिस्ट फ़ाइल बनाएँ:

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    इन फ़ाइलों को सिर्फ प्लेसहोल्डर हैं।

  2. एक स्क्रिप्ट है कि वर्तमान प्लेलिस्ट सूचकांक आप का ट्रैक रखता है और बनाता है सांकेतिक लिंक बनाने current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. के लिए ऑन-द-मक्खी
  4. प्रारंभ खेलने ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  5. गुस्से में सिस्टम व्यवस्थापक

+0

धन्यवाद, बस आपका जवाब देखा। मैंने इसे पहले हनीकल टिप्पणी के साथ समझ लिया, भले ही मुझे इस तरह के हैक्स में दिलचस्पी नहीं है, भले ही – KKetch

+0

क्या आप 'स्क्रिप्ट बनाएं' जो आप वर्तमान प्लेलिस्ट इंडेक्स का ट्रैक रखता है और उस पर प्रतीकात्मक लिंक बनाता है, current_index + 1' के लिए उड़ान भरें? इसके लिए क्या उद्देश्य है? – chovy

+0

.m3u8 24/7 स्ट्रीम के लिए एक ही काम करने की कोशिश कर रहा है। लेकिन आदेश '-c प्रति आउटपुट -f mpegts stream.m3u8' एक त्रुटि फेंकता है। – chovy

0

आप पाइप एक बफर करने के लिए अपने पाश कर सकते हैं द्वारा पीछा किया हो जाओ और कहा जाता है नाम, और इस से अपने स्ट्रीमिंग उदाहरण के लिए आप पाइप बफ़र।

#!/bin/bash 

for i in *.mp4; do 
     ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts - 
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream 
बेशक

आप, पाश के किसी भी प्रकार का उपयोग कर सकते भी एक प्लेलिस्ट के माध्यम से पाशन:

खोल में यह कैसा दिखेगा।

  • मैं यह पता लगाने की है कि एमपीईजी में थोड़ा और अधिक स्थिर है, तो इनपुट धारा
  • के लिए x264 मैं पता नहीं क्यों, लेकिन कम से कम 2 धागे के लिए एमपीईजी संपीड़न काम करता है बेहतर
  • इनपुट संपीड़न की जरूरत है आउटपुट फ्रेम दर तेज होने के लिए, इसलिए हमें तेजी से पर्याप्त नया इनपुट
  • गैर निरंतर टाइम स्टैम्प की वजह से हमें उन्हें छोड़ना होगा और आउटपुट
  • में एक नया उत्पन्न करना होगा बफर आकार को काफी बड़ा होना चाहिए लूप के लिए नई क्लिप प्राप्त करने के लिए पर्याप्त समय है।

मैं अजगर आधारित समाधान पर काम करते हैं, अभी तक पूरा नहीं है, लेकिन कुछ चेतावनियों को छोड़कर अपने परीक्षण धारा से अधिक दिनों से चलाता है:

ffplayout

यह एक एक्सएमएल प्लेलिस्ट प्रारूप का उपयोग करता। और प्लेलिस्ट गतिशील है, इस तरह से आप हमेशा मौजूदा प्लेलिस्ट को संपादित कर सकते हैं, और ट्रैक बदल सकते हैं या नए जोड़ सकते हैं।

0

दो प्लेलिस्ट फ़ाइलों को बनाने की आवश्यकता है और प्रत्येक फ़ाइल के अंत में दूसरी फ़ाइल के लिए एक लिंक निर्दिष्ट करें।

list_1.txt

ffconcat version 1.0 
file 'item_1.mp4' 
file 'list_2.txt' 

list_2.txt

ffconcat version 1.0 
file 'item_2.mp4' 
file 'list_1.txt' 

अब आप सभी की जरूरत गतिशील अगले प्लेलिस्ट फ़ाइल की सामग्री को बदलने के लिए है।