android आरटीपी स्ट्रीम प्राप्त करना-ऑडियोस्ट्रीम, ऑडियो समूह




audio ffmpeg (2)

अपने प्रश्न का उत्तर देकर, समस्या एंड्रॉइड आरटीपी पैकेट प्रबंधन के साथ थी I

एंड्रॉइड ने कहा ... assume packet interval is 50ms or less. कि ... assume packet interval is 50ms or less. ऑडियो ग्रुप स्रोत फ़ाइल में

हालांकि, आरटीपी पैकेट अंतराल 60 के साथ भेज रहे हैं।

इसका मतलब है कि 50ms पर्याप्त नहीं हैं और यह नीचे बताए अनुसार समस्या की ओर जाता है।

Incoming: X X X X X X Y Y Y Y Y Y X X X X X X Y Y Y Y Y Y X X X X X X
Reading : X X X X X Y Y Y Y Y X X X X X Y Y Y Y Y X X X X X Y Y Y Y Y
          ^ ^ ^ ^ ^ - - - - - - - - - - - - - - - - - - - - ^ ^ ^ ^ ^ 
          ^                                                 ^
          |                                                 |
          |---- just these overlapping packets is valid ----|
          |---- and other packets discarding due to --------|
          |---- invalid RTP headers. -----------------------|

X, Y < packets

मेरे पास हर 300ms अंतराल में सिर्फ एक पैकेट है। यह झिलेदार ध्वनि का परिणाम है

मैं इसके लिए एक बग रिपोर्ट भेजूंगा, आशा है कि यह किसी को मदद करता है

जो लोग वास्तव में कच्चे आरटीपी स्ट्रीम सुनना चाहते हैं, मैं उन्हें मैन्युअल रूप से पैकेट पढ़ने और पीसीएम 16bit (जो कि एंड्रॉइड ध्वनि कार्ड का समर्थन करता है, केवल ऑडियो प्रारूप है) को ऑडियोड्रैक पर लिखने का सुझाव देता है।

मैं एक आरटीपी ऑडियो स्ट्रीम सुनना चाहूंगा, हालांकि इसमें आवाज बहुत कम है - जारी नहीं है क्या समाधान हो सकता है? क्या मैं रिसीवर (एंड्रॉइड) पक्ष या स्ट्रीमर (एफएफपीएपी) की तरफ कुछ भूल रहा हूं?

मैं आरएफपी ऑडियो स्ट्रीम करने के लिए ffmpeg का उपयोग कर रहा हूं,

ffmpeg -f lavfi -i aevalsrc="sin(400*2*PI*t)" -ar 8000 -vcodec pcm_u8 -f rtp rtp://192.168.0.15:41954 (port changes.)

और यहां मेरा संबंधित एंड्रॉइड कोड है:

AudioStream audioStream;
AudioGroup audioGroup;
@Override
public void onStart() {
    super.onStart();
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
    StrictMode.setThreadPolicy(policy);
    AudioManager audio = (AudioManager)getSystemService(AUDIO_SERVICE);
    audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
    audioGroup = new AudioGroup();
    audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
    InetAddress inetAddress;
    try {
        inetAddress = InetAddress.getByName("192.168.0.15");
        audioStream = new AudioStream(inetAddress);
        audioStream.setCodec(AudioCodec.PCMU);
        audioStream.setMode(RtpStream.MODE_NORMAL);
        InetAddress inetAddressRemote = InetAddress.getByName("192.168.0.14");
        audioStream.associate(inetAddressRemote, 6000);
        ((TextView)findViewById(R.id.tv_port)).setText("Port : " + String.valueOf(audioStream.getLocalPort()));
        audioStream.join(audioGroup);
    }
    catch ( UnknownHostException e ) {
        e.printStackTrace();
    }
    catch ( SocketException e ) {
        e.printStackTrace();
    }
}

माफ़ अगर निम्नलिखित मूक है:

एफएफपीईजी कमांड लाइन एक टेस्ट ध्वनि पैदा कर रहा है और इसे आरटीपी पर एक पीसीएम डाटा स्ट्रीम के रूप में उत्सर्जित करता है।

आरटीपी अपने आप ही स्ट्रीम किए गए डेटा के विश्वसनीय वितरण की गारंटी नहीं देता है, यह केवल पर्याप्त जानकारी प्रदान करता है कि रिसीवर को बताने के लिए कि वह सभी डेटा प्राप्त कर लेता है, और यदि कुछ ट्रांज़िट में खो गया तो ठीक से डेटा क्या है। प्लस यह आमतौर पर यूडीपी पर इस्तेमाल किया जाता है।

इसलिए आरटीपी के साथ आरटीपी के उपयोगकर्ता पर ऐसे डेटा को भेजने के लिए जोर दिया जाता है जो इस तरह से एन्कोड किया जाता है (यानी त्रुटि सुधार कोडिंग, डेटा में अतिरेक आदि) ताकि रिसीवर आवेदन के पूरा होने के लिए मूल आंकड़ों के पर्याप्त पुनर्निर्माण कर सके। की जरूरत है। तो एक ऑडियो स्ट्रीम के साथ आपको सूट के कुछ प्रकार के एन्कोडिंग प्रारूप की आवश्यकता होती है

मुझे pcm_u8 का क्या अर्थ है, इसका संदर्भ नहीं मिला है, लेकिन यह 8 बिट डेटा के साथ सीधी पल्स कोड मॉडिटेड डेटा स्ट्रीम होने का अत्यधिक सुझाव है। ऐसा नहीं लगता है कि इसमें कोई त्रुटि सुधार एन्कोडिंग या डेटा रिडंडेंसी है इसका मतलब है कि एक नमूना खोने का एक बाइट खोना है, और कुछ भी नहीं है जो प्राप्त करने के अंत में किया जा सकता है।

तो मुझे लगता है कि जो कुछ हो रहा है वह है कि आपके नेटवर्क में कुछ यूडीपी पैकेट गिर रहा है, जो कि आरटीपी ऑडिओस्ट्रीम को बता रहा है कि कौन सा डाटा गुम है और इसका परिणाम अंतराल है क्योंकि पीसीएम_यू 8 डेटा स्ट्रीम में कोई त्रुटि सुधार या डेटा रिडंडेंसी नहीं है, ऑडियोस्ट्रीम द्वारा पुनर्निर्माण किया जाना चाहिए

मैंने देखा है कि वीएमवायर जैसी चीजें जानबूझकर यूडीपी पैकेट को एक आभासी नेटवर्क पर अच्छे प्रदर्शन को सुनिश्चित करने के एक तरीके के रूप में छोड़ देती हैं, ये ये औचित्य है कि यूडीपी को डिलीवरी की गारंटी नहीं है, इसलिए "इससे कोई फर्क नहीं पड़ता"। वह गंभीर रूप से एक सहयोगी को चूका गया जो आरटीपी का उपयोग कर रहा था और गारंटीकृत वितरण की उम्मीद कर रहा था लेकिन उसे नहीं मिला। तार के प्रत्येक छोर पर उसे एक बंद नेटवर्क सेगमेंट मिला, उनमें से एक ने एक वीएम की मेजबानी की

इसलिए यह केवल उस कोड को बदलने का मामला हो सकता है जो आप उपयोग कर रहे हैं मैं एक की सिफारिश करने में सक्षम नहीं हूँ एक शुरुआत के लिए यह देखने लायक है कि एक प्रसारित डिजिटल मीडिया स्ट्रीम का उपयोग कैसे होता है। डीवीबी-टी MPEG ट्रांसपोर्ट स्ट्रीम का उपयोग करता है (जिसमें त्रुटि सुधार कोडिंग है, आदि), एपीएआईके, एमपीईजी -2 के आस-पास एक आवरण





rtp