2011-04-06 31 views
9

मैं इस कोड के साथ RTSP के रूप में वीएलसी का उपयोग कर सर्वर Android MediaPlayer पर RTSP को क्रियान्वित किया है:आरटीपी पर Android MediaPlayer

# vlc -vvv /home/marco/Videos/pippo.mp4 --sout 
#rtp{dst=192.168.100.246,port=6024-6025,sdp=rtsp://192.168.100.243:8080/test.sdp} 

और Android परियोजना पर:


Uri videoUri = Uri.parse("rtsp://192.168.100.242:8080/test.sdp"); 
videoView.setVideoURI(videoUri); 
videoView.start(); 

यह ठीक काम करता है लेकिन अगर मैं लाइव स्ट्रीम आरटीपी भी खेलना चाहता हूं तो मैं एसडीपी फाइल को एसडीकार्ड में कॉपी करता हूं (/mnt/sdcard/test.sdp) और स्थापित करने वीएलसी:


Uri videoUri = Uri.parse("/mnt/sdcard/test.sdp"); 
videoView.setVideoURI(videoUri); 
videoView.start(); 

:

# vlc -vvv /home/marco/Videos/pippo.mp4 --sout 
#rtp{dst=192.168.100.249,port=6024-6025} 

मैं SDP फाइल स्थानीय स्तर के पथ की स्थापना धारा आरटीपी खेलने के लिए करने की कोशिश की

लेकिन मुझे एक त्रुटि मिली:


D/MediaPlayer(9616): Couldn't open file on client side, trying server side 
W/MediaPlayer(9616): info/warning (1, 26) 
I/MediaPlayer(9616): Info (1,26) 
E/PlayerDriver( 76): Command PLAYER_INIT completed with an error or info PVMFFailure 
E/MediaPlayer(9616): error (1, -1) 
E/MediaPlayer(9616): Error (1,-1) 
D/VideoView(9616): Error: 1,-1 

क्या किसी को पता है कि समस्या कहां है? क्या मैं गलत हूं या मीडियाप्लेयर पर आरटीपी खेलने के लिए संभव नहीं है? चीयर्स जियोर्जियो

उत्तर

-1

दुर्भाग्य से एंड्रॉइड मीडियाप्लेयर के साथ आरटीपी स्ट्रीम खेलना संभव नहीं है।

इस समस्या के समाधान में ffmpeg के साथ आरटीपी स्ट्रीम का डीकोडिंग शामिल है। Android पर ffmpeg को संकलित करने के तरीके पर ट्यूटोरियल वेब पर पाए जा सकते हैं।

+0

आप हमें कुछ दिखा सकते हैं लिंक? –

+1

मैंने इंटरनेट पर बहुत कुछ खोजा और इसमें कई ट्यूटोरियल और पोस्ट हैं जो इसे बनाने के तरीके को समझाते हैं। कुछ काम और कुछ नहीं करते हैं। हो सकता है कि आप इस पोस्ट http://www.roman10.net/?p=389 पर नज़र डालें या यहां तक ​​कि देखें कि रॉकप्लेयर के लोगों ने http://www.rockplayer.com/tech_en.html किया था। पहला विवरण रॉकप्लेयर लोगों से निर्मित स्क्रिप्ट पर निर्भर करता है। – ladi

2

मेरे पास आपके लिए आंशिक समाधान है।

मैं वर्तमान में एक RAID & डी पर काम कर रहा हूं जिसमें एक सर्वर से एंड्रॉइड क्लाइंट्स तक मीडिया से आरटीपी स्ट्रीमिंग शामिल है।

इस काम को करके, मैं अपनी खुद की लाइब्रेरी में योगदान देता हूं जिसे smpte2022lib कहा जाता है, आप यहां पा सकते हैं: http://sourceforge.net/projects/smpte-2022lib/

इस तरह के पुस्तकालय के साथ मदद की (जावा कार्यान्वयन वर्तमान में सबसे अच्छा एक है) आप आरटीपी बहुस्त्र्पीय धाराओं पेशेवर स्ट्रीमिंग equipements से आ रही पार्स करने के लिए सक्षम हो सकता है, वीएलसी आरटीपी सत्र, ...

मैं पहले से ही यह सफलतापूर्वक परीक्षण के साथ एसएमपीटीई -2022 2 डी-एफईसी या वीएलसी के साथ उत्पन्न सरल धाराओं के साथ कैप्चर प्रोफेशनल आरटीपी धाराओं से आने वाली धाराएं।

दुर्भाग्य से मैं यहां कोड-स्निपेट नहीं डाल सकता क्योंकि इसका उपयोग कर प्रोजेक्ट वास्तव में कॉपीराइट के तहत है, लेकिन मैं आपको यह सुनिश्चित करता हूं कि आप इसका उपयोग आरटीपीपैकेट कन्स्ट्रक्टर के साथ मदद की यूडीपी धाराओं को पार्स करके कर सकते हैं।

यदि पैकेट वैध आरटीपी पैकेट (बाइट्स) हैं तो उन्हें इस तरह डीकोड किया जाएगा।

इस समय, मैं कॉल को आरटीपीपैकेट के कन्स्ट्रक्टर को थ्रेड पर लपेटता हूं जो वास्तव में डीकोडेड पेलोड को मीडिया फ़ाइल के रूप में संग्रहीत करता है।फिर मैं इस फ़ाइल के साथ वीडियो व्यू को पैरामीटर के रूप में कॉल करूंगा।

पार उंगलियों ;-)

सधन्यवाद,

डेविड फ़िशर

0
एंड्रॉयड में

संभव नहीं है (MediaPlayer लेकिन आगे ढेर नीचे अन्य सामग्री) का उपयोग करते हैं, लेकिन क्या तुम सच में आगे बढ़ाने RTSP करना चाहती/आरटीपी जब बाकी मीडिया पारिस्थितिक तंत्र नहीं है ??

आईएमओ - एचटीएमएल 5/वेबआरटीसी की छतरी के नीचे कहीं बेहतर मीडिया/स्ट्रीम दृष्टिकोण हैं। देखें कि 'Ondello' धाराओं के साथ क्या कर रहा है।

यह कहा गया है, यहां 'netty' और 'efflux' का उपयोग करके एंड्रॉइड/आरटीएसपी/एसडीपी/आरटीपी के लिए कुछ पुराना प्रोजेक्ट कोड है। यह एसडीपी फाइल प्रदाताओं पर 'सत्र' के कुछ हिस्सों पर बातचीत करेगा। याद रखें कि यह वास्तव में Youtube/RTSP stuff के ऑडियो हिस्से को चलाएगा, लेकिन उस समय मेरा लक्ष्य यही था। (मैं यह है कि यह AMR-NB कोडेक का उपयोग लेकिन काम लगता है, मुद्दों के टन वहाँ थे और मैं एक बुरी आदत की तरह एंड्रॉयड पर RTSP गिरा दिया!)

on Git ....

 @Override 
     public void mediaDescriptor(Client client, String descriptor) 
     { 
      // searches for control: session and media arguments. 
      final String target = "control:"; 
      Log.d(TAG, "Session Descriptor\n" + descriptor); 
      int position = -1; 
      while((position = descriptor.indexOf(target)) > -1) 
      { 
       descriptor = descriptor.substring(position + target.length()); 
       resourceList.add(descriptor.substring(0, descriptor.indexOf('\r'))); 
      } 
     } 
     private int nextPort() 
     { 
      return (port += 2) - 2; 
     }  


     private void getRTPStream(TransportHeader transport){ 

      String[] words; 
      // only want 2000 part of 'client_port=2000-2001' in the Transport header in the response 

      words = transport.getParameter("client_port").substring(transport.getParameter("client_port").indexOf("=") +1).split("-"); 
      port_lc = Integer.parseInt(words[0]); 

      words = transport.getParameter("server_port").substring(transport.getParameter("server_port").indexOf("=") +1).split("-"); 
      port_rm = Integer.parseInt(words[0]); 

      source = transport.getParameter("source").substring(transport.getParameter("source").indexOf("=") +1);   
      ssrc = transport.getParameter("ssrc").substring(transport.getParameter("ssrc").indexOf("=") +1); 
      // assume dynamic Packet type = RTP , 99 
      getRTPStream(session, source, port_lc, port_rm, 99); 
      //getRTPStream("sessiona", source, port_lc, port_rm, 99); 
      Log.d(TAG, "raw parms " +port_lc +" " +port_rm +" " +source); 
//   String[] words = session.split(";"); 
     Log.d(TAG, "session: " +session); 
     Log.d(TAG, "transport: " +transport.getParameter("client_port") 
       +" " +transport.getParameter("server_port") +" " +transport.getParameter("source") 
       +" " +transport.getParameter("ssrc")); 

     } 

     private void getRTPStream(String session, String source, int portl, int portr, int payloadFormat){ 
      // what do u do with ssrc? 
      InetAddress addr; 
      try { 
       addr = InetAddress.getLocalHost(); 
       // Get IP Address 
//    LAN_IP_ADDR = addr.getHostAddress(); 
       LAN_IP_ADDR = "192.168.1.125"; 
       Log.d(TAG, "using client IP addr " +LAN_IP_ADDR); 

      } catch (UnknownHostException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 


      final CountDownLatch latch = new CountDownLatch(2); 

      RtpParticipant local1 = RtpParticipant.createReceiver(new RtpParticipantInfo(1), LAN_IP_ADDR, portl, portl+=1); 
    //  RtpParticipant local1 = RtpParticipant.createReceiver(new RtpParticipantInfo(1), "127.0.0.1", portl, portl+=1); 
      RtpParticipant remote1 = RtpParticipant.createReceiver(new RtpParticipantInfo(2), source, portr, portr+=1); 


      remote1.getInfo().setSsrc(Long.parseLong(ssrc, 16)); 
      session1 = new SingleParticipantSession(session, payloadFormat, local1, remote1); 

      Log.d(TAG, "remote ssrc " +session1.getRemoteParticipant().getInfo().getSsrc()); 

      session1.init(); 

      session1.addDataListener(new RtpSessionDataListener() { 
       @Override 
       public void dataPacketReceived(RtpSession session, RtpParticipantInfo participant, DataPacket packet) { 
    //    System.err.println("Session 1 received packet: " + packet + "(session: " + session.getId() + ")"); 
        //TODO close the file, flush the buffer 
//     if (_sink != null) _sink.getPackByte(packet); 
        getPackByte(packet); 

    //    System.err.println("Ssn 1 packet seqn: typ: datasz " +packet.getSequenceNumber() + " " +packet.getPayloadType() +" " +packet.getDataSize()); 
    //    System.err.println("Ssn 1 packet sessn: typ: datasz " + session.getId() + " " +packet.getPayloadType() +" " +packet.getDataSize()); 
//     latch.countDown(); 
       } 

      }); 
    //  DataPacket packet = new DataPacket(); 
     //  packet.setData(new byte[]{0x45, 0x45, 0x45, 0x45}); 
    //  packet.setSequenceNumber(1); 
    //  session1.sendDataPacket(packet); 


//  try { 
     //  latch.await(2000, TimeUnit.MILLISECONDS); 
    //  } catch (Exception e) { 
    //   fail("Exception caught: " + e.getClass().getSimpleName() + " - " + e.getMessage()); 

//  } 
     } 
//TODO below should collaborate with the audioTrack object and should write to the AT buffr 
     // audioTrack write was blocking forever 

    public void getPackByte(DataPacket packet) { 
      //TODO this is getting called but not sure why only one time 
      // or whether it is stalling in mid-exec?? 

      //TODO on firstPacket write bytes and start audioTrack 
      // AMR-nb frames at 12.2 KB or format type 7 frames are handled . 
      // after the normal header, the getDataArray contains extra 10 bytes of dynamic header that are bypassed by 'limit' 


      // real value for the frame separator comes in the input stream at position 1 in the data array 
      // returned by 

//   int newFrameSep = 0x3c; 
      // bytes avail = packet.getDataSize() - limit; 

//   byte[] lbuf = new byte[packet.getDataSize()]; 
//   if (packet.getDataSize() > 0) 
//    lbuf = packet.getDataAsArray(); 
      //first frame includes the 1 byte frame header whose value should be used 
      // to write subsequent frame separators 
      Log.d(TAG, "getPackByt start and play"); 

      if(!started){ 
       Log.d(TAG, " PLAY audioTrak"); 
       track.play(); 
       started = true; 
      } 

//   track.write(packet.getDataAsArray(), limit, (packet.getDataSize() - limit)); 
      track.write(packet.getDataAsArray(), 0, packet.getDataSize()); 
      Log.d(TAG, "getPackByt aft write"); 

//   if(!started && nBytesRead > minBufferSize){ 
    //   Log.d(TAG, " PLAY audioTrak"); 
     //  track.play(); 
     // started = true;} 
      nBytesRead += packet.getDataSize(); 
      if (nBytesRead % 500 < 375) Log.d(TAG, " getPackByte plus 5K received"); 
     }  
    } 
संबंधित मुद्दे