2012-01-30 20 views
12

का उपयोग करते समय वाईफाई पर ही खेलता है मैं एंड्रॉइड एप्लिकेशन में यूट्यूब वीडियो स्ट्रीम करने के लिए निम्न लाइब्रेरी का उपयोग कर रहा हूं।वीडियो व्यू पर स्ट्रीमिंग सैमसंग फोन

http://code.google.com/p/android-youtube-player/source/browse/trunk/OpenYouTubeActivity/src/com/keyes/youtube/OpenYouTubePlayerActivity.java?r=3

मैं सफलतापूर्वक 3 जी और वाईफाई पर और एचटीसी पर वीडियो मोटोरोला फोन के खेलने के लिए सक्षम हूँ। हालांकि, सैमसंग गैलेक्सी (एपिक 4 जी) और सैमसंग गैलेक्सी II फोन पर मैं केवल वाईफ़ाई का उपयोग करने में सक्षम हूं। 3 जी मुझे यह त्रुटि देता है: "वीडियो नहीं चला सकता। क्षमा करें इस वीडियो को नहीं खेला जा सकता है।"

मैंने कम गुणवत्ता वाली YouTube स्ट्रीमिंग को मजबूर करने का प्रयास किया है, लेकिन इससे मदद नहीं मिली। मैं अपने लॉग में देखता हूं कि Start() दोनों मामलों (3 जी/वाईफ़ाई) में बुलाया जा रहा है। क्या यह वीडियो व्यू के साथ एक मुद्दा है? क्या आसपास कोई काम है?

संपादित 2

वीडियो यूट्यूब एपीआई से आ रहे हैं। मैंने एम्बेडेड और सामान्य धाराओं का उपयोग करने का प्रयास किया है, साथ ही निम्न गुणवत्ता वाली स्ट्रीम उपलब्ध है (प्रति वीडियो अलग-अलग)। साथ ही, मुझे नहीं लगता कि यह एक एन्कोडिंग समस्या है क्योंकि वही वीडियो वाईफाई का उपयोग करके सही ढंग से खेलते हैं।

संपादित करें 1

मैं भी मौसम वीडियो की परवाह किए बिना निम्नलिखित उत्पादन प्राप्त वाईफ़ाई का उपयोग कर नाटक या 3 जी का उपयोग नहीं करता है।

/* 
Definition of first error event in range (not an actual error code). 
*/ 
const PVMFStatus PVMFErrFirst = (-1); 
/* 
Return code for general failure 
*/ 
const PVMFStatus PVMFFailure = (-1); 
/* 

/* 
Return code for general success 
*/ 
const PVMFStatus PVMFSuccess = 1; 
/* 

इसके अलावा जोड़ने भ्रम:

01-30 15:22:38.305: E/MediaPlayer(3831): error (1, -1) 
01-30 15:22:38.305: E/MediaPlayer(3831): callback application 
01-30 15:22:38.305: E/MediaPlayer(3831): back from callback 
01-30 15:22:38.309: E/MediaPlayer(3831): Error (1,-1) 

इस Link के अनुसार, इन त्रुटियों को निम्नलिखित (मुझे लगता है कि) का अर्थ है।

+1

ऐसा लगता है कि यह समस्या [अन्य उपकरणों] को प्रभावित करती है (http://code.google.com/p/android-youtube-player/issues/detail?id=7) – Zakaria

+0

@Zakaria Ah, हाँ। उसे इंगित करने के लिए धन्यवाद। –

+0

क्या आप हमें बता सकते हैं कि आपके डिवाइस के एपीआई स्तर क्या हैं? वह काम और वह काम नहीं करता है। –

उत्तर

4

हाँ, आप सोच रहे हैं के रूप में, इस VideoView में एक मुद्दा है, इसी तरह के मुद्दों को भी MediaPlayer में दिखाई देते हैं, और मैं इसी तरह की और अजीब मुद्दों के रूप में तुमने किया था, मैं समस्या नहीं थी सामना करना पड़ा जब वीडियो 3 जी पर ही खेला गया था और वाई-फाई पर नहीं। यह आमतौर पर 2.1 और कुछ 2.2 डिवाइस पर होता है, लेकिन उच्च एपीआई स्तरों पर नहीं, जैसा कि मैंने अभी तक देखा है।

तो क्या मैं सिफारिश कर सकते हैं निम्न कार्य है: चल रहा है डिवाइस एक मुद्दों हो सकता है, कुछ इस तरह हो सकता है

अगर

पहले जांच कर लें:

//Define a static list of known devices with issues 
static List sIssueDevices=Arrays.asList(new String[]{"HTC Desire","LG-P500","etc"}); 

if(Build.VERSION.SDK_INT<9){ 
    if(sIssueDevices.contains(Build.Device){ 
     //This device may have issue in streaming, take appropriate actions 
    } 
} 

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

private class GetYoutubeFile extends Thread{ 
    private String mUrl; 
    private String mFile; 
    public GetYotubeFile(String url,String file){ 
     mUrl=url; 
     mFile=file; 
    } 

    @Override 
    public void run() { 
     super.run(); 
     try { 

      File bufferingDir=new File(Environment.getExternalStorageDirectory() 
        +"/YoutubeBuff"); 

      File bufferFile=new File(bufferingDir.getAbsolutePath(), mFile); 
      //bufferFile.createNewFile(); 
      BufferedOutputStream bufferOS=new BufferedOutputStream(
             new FileOutputStream(bufferFile)); 

      URL url=new URL(mUrl); 
      URLConnection connection=url.openConnection(); 
      connection.setRequestProperty("User-Agent", "Mozilla"); 
      connection.connect(); 
      InputStream is=connection.getInputStream(); 
      BufferedInputStream bis=new BufferedInputStream(is,2048); 

      byte[] buffer = new byte[16384]; 
      int numRead; 
      boolean started=false; 
      while ((numRead = bis.read(buffer)) != -1 && !mActivityStopped) { 
       //Log.i("Buffering","Read :"+numRead); 
       bufferOS.write(buffer, 0, numRead); 
       bufferOS.flush(); 
       mBuffPosition += numRead; 
       if(mBuffPosition>120000 &&!started){ 
        Log.e("Player","BufferHIT:StartPlay"); 
        setSourceAndStartPlay(bufferFile); 
        started=true; 
       } 

      } 
      Log.i("Buffering","Read -1?"+numRead+" stop:"+mActivityStopped); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void setSourceAndStartPlay(File bufferFile) { 
    try { 
     mPlayer.setVideoPath(bufferFile.getAbsolutePath()); 
     mPlayer.prepare(); 
     mPlayer.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

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

public void onCompletion(MediaPlayer mp) { 
    mPlayerPosition=mPlayer.getCurrentPosition(); 
    try { 
     mPlayer.reset(); 
     mPlayer.setVideoPath(
      new File("mnt/sdcard/YoutubeBuff/"+mBufferFile).getAbsolutePath()); 
     mPlayer.seekTo(mPlayerPosition); 
     mPlayer.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

अंत में, जाहिर है GetYoutubeFile धागा शुरू कर दिया है onCreate() विधि में:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //init views,player,etc 
    new GetYoutubeFile().start(); 
} 

कुछ संशोधनों और अनुकूलन मुझे लगता है कि इस कोड के लिए किया जा करना होगा, और यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह मुझे मदद की, और मैं किसी भी विकल्प नहीं पा सके।

+0

परीक्षण नहीं किया था लेकिन निश्चित रूप से तर्क के लिए एक +1! मैं बस इस यूट्यूबप्लेयर कोड के माध्यम से स्किम किया और वाईफ़ाई के लिए कुछ चेक देखा। क्या इससे कोई समस्या होगी? मेरा मतलब है कि आप निश्चित हैं कि यह एक वीडियो व्यू समस्या है? –

+0

मैं यह नहीं कह सकता कि मैं 100% निश्चित हूं। लेकिन मुझे निश्चित रूप से पता है कि वही वीडियो 3 जी पर काम कर रहा था, कुछ उपकरणों पर वाईफाई पर नहीं, और कुछ अन्य उपकरणों पर वाइसवर्सा। इसलिए मैं केवल यह सोच सकता हूं कि 'VideoView' के अंदर कुछ है, न कि वीडियो प्रारूप समस्या। –

0

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

+0

यदि यह मामला है, तो वही वीडियो वाईफ़ाई पर क्यों काम करते हैं? –

1

मैं अपने खुद के way.First में इस समस्या से निपटने के लिए है हर बार अपनी लॉग cat.If आप

Error (1,-1) 

मिला मतलब है कि आप इस मामले में sorry,this video can not play message तो मिलता है, कि गतिविधि खत्म हो जाएगा कस्टम देना पढ़ प्रगति पट्टी और वीडियो डाउनलोड करें। फिर इसे अस्थायी फ़ोल्डर में सहेजने के बाद डाउनलोड करें। इसे चलाएं। उस फ़ोल्डर को हटाने के बाद।

पढ़ने लॉग बिल्ली के लिए ---

try { 
    Process process = Runtime.getRuntime().exec("logcat -d"); 
    BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(process.getInputStream())); 
    StringBuilder log=new StringBuilder(); 
    String line; 
    while ((line = bufferedReader.readLine()) != null) { 
    log.append(line); 
    } 
} catch (IOException e) { 
} 

भी इस जवाब पढ़ें। हालांकि यह केवल उपयोगकर्ता अनुभव ऐप से जुड़ा हुआ नहीं है। लेकिन कभी-कभी डिफ़ॉल्ट एप्लिकेशन में भी होता है

वीडियो के ढेर, भले ही मेरे पास पूर्ण 3 जी नेटवर्क कवरेज है, "क्षमा करें, यह वीडियो नहीं चलाया जा सकता"। एक दिन, मैं इसके साथ इतनी परेशान हो गया, मैंने संदेश को खारिज करने के लिए 'ठीक है' दबाकर रखा, और फिर वीडियो को फिर से दबाया "क्षमा करें, यह वीडियो नहीं खेला जा सकता" संदेश फिर से। मैंने इस प्रक्रिया को दोहराया (मेरे अंधेरे क्रोध में), लेकिन आखिरकार, लगभग 5 कोशिशों के बाद, वीडियो ने चमत्कारी रूप से खेलने का फैसला किया!

यह विधि हर बार मेरे लिए काफी काम करती है। अधिकांश वीडियो पहली बार नहीं खेलना चाहते हैं, लेकिन आखिरकार अगर मैं लगातार रहता हूं, और इसे खेलने के लिए कहता रहता हूं, भले ही यह मुझे बताता है कि यह वीडियो चला नहीं सकता है, यह खेलेंगे! हालांकि, कुछ वीडियो मुझे 'ठीक है' दबाएं, वीडियो दबाएं, 'ठीक है' दबाएं, वीडियो इत्यादि दबाएं ... वास्तव में इसे खेलने का फैसला करने से 20 गुना पहले। उन बार, मैं अपने फोन को पाने और फर्श पर फेंकने के लिए अविश्वसनीय रूप से करीब रहा हूं क्योंकि मैं कितना शर्मिंदा हूं कि यूट्यूब कैसे काम नहीं करेगा।

मेरी इच्छा है कि इस समस्या को ठीक करने का कोई तरीका हो। ऐसा लगता है कि कोई भी समाधान के साथ नहीं आया है। हर कोई सिर्फ इतना कहता है "ओह हाँ मुझे एक ही समस्या है" लेकिन कोई भी कुछ भी योगदान नहीं देता है। GOOGLE, अपने फोन पर इस समस्या को हल करें। एंड्रॉइड फोनों की एक सीमा पर, यह दुनिया भर में होने वाली है।

+0

क्या आप मेरे उत्तर से संतुष्ट हैं? – Sameer

+0

आपको लॉग इन को पढ़ने की ज़रूरत नहीं है जिसे आप एन्टर लिस्टनर कॉलबैक विधि पर संलग्न कर सकते हैं जो आपको ये त्रुटि देगा –

+0

आप इसे भी कर सकते हैं .. लेकिन कभी-कभी यह नहीं आती है एरर लिस्टनर – Sameer

संबंधित मुद्दे