gpt4 book ai didi

android - 流式传输到 VideoView 仅在使用三星手机时在 Wifi 上播放

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:53 24 4
gpt4 key购买 nike

我正在使用以下库将 YouTube 视频流式传输到 Android 应用程序。

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

我可以通过 3G 和 Wifi 在 HTC 和摩托罗拉手机上成功播放视频。但是,在 Samsung Galaxy (Epic 4G) 和 Samsung Galaxy II 手机上,我只能使用 Wifi 进行游戏。 3G 给我这个错误:“无法播放视频。抱歉,无法播放此视频。”

我曾尝试强制播放低质量的 YouTube 流媒体,但这没有帮助。我在日志中看到 Start() 在两种情况下 (3G/Wifi) 都被调用了。这是 VideoView 的问题吗?有解决方法吗?

编辑2

视频来自 YouTube API。我曾尝试使用嵌入式和普通流,以及可用的最低质量流(因视频而异)。此外,我认为这不是编码问题,因为使用 Wifi 可以正确播放相同的视频。

编辑 1

无论是使用 Wifi 还是不使用 3G 播放视频,我都会收到以下输出。

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 ,这些错误意味着以下(我认为):

/*
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;
/*

进一步增加了困惑。

最佳答案

是的,正如你所想,这是VideoView的问题,MediaPlayer也出现了类似的问题,我也遇到过和你一样的奇怪问题, 当视频仅在 3G 而不是 Wi-Fi 上播放时,我遇到了问题。这通常发生在 2.1 和一些 2.2 设备上,但在我目前所见的更高 API 级别上不会发生。

所以我可以推荐的是执行以下操作:

首先检查正在运行的设备是否可能有问题,如下所示:

//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
}
}

所以这是最简单的部分,检测正在运行的设备在流式传输视频时是否存在问题。现在,我所做的也可能对您有所帮助,是将来自 Youtube 的视频缓冲到 SDCard 上的一个文件中,并将该文件设置为您的 VideoView 的 source 。我将编写一些代码 fragment 以查看我的方法:

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();
}
}

VideoView 在文件结束前停止播放时会出现另一个问题,因为文件中没有足够的缓冲。为此,您需要设置一个 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();
}

我认为必须对此代码进行一些修改和改编,这可能不是最好的方法,但它对我有帮助,我找不到任何替代方法。

关于android - 流式传输到 VideoView 仅在使用三星手机时在 Wifi 上播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com