हाँ, आप सोच रहे हैं के रूप में, इस 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();
}
कुछ संशोधनों और अनुकूलन मुझे लगता है कि इस कोड के लिए किया जा करना होगा, और यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह मुझे मदद की, और मैं किसी भी विकल्प नहीं पा सके।
ऐसा लगता है कि यह समस्या [अन्य उपकरणों] को प्रभावित करती है (http://code.google.com/p/android-youtube-player/issues/detail?id=7) – Zakaria
@Zakaria Ah, हाँ। उसे इंगित करने के लिए धन्यवाद। –
क्या आप हमें बता सकते हैं कि आपके डिवाइस के एपीआई स्तर क्या हैं? वह काम और वह काम नहीं करता है। –