Java 另一个线程中的Android视频视图&;安卓2.1的问题
我想流视频形式的网址在android视频视图。我使用示例api代码,并对其进行了少量修改以满足我的需要Java 另一个线程中的Android视频视图&;安卓2.1的问题,java,android,multithreading,video-streaming,android-videoview,Java,Android,Multithreading,Video Streaming,Android Videoview,我想流视频形式的网址在android视频视图。我使用示例api代码,并对其进行了少量修改以满足我的需要 public class VideoViewDemo extends Activity { private static final String TAG = "VideoViewDemo"; private String current; /** * TODO: Set the path variable to a streaming video URL or a local medi
public class VideoViewDemo extends Activity {
private static final String TAG = "VideoViewDemo";
private String current;
/**
* TODO: Set the path variable to a streaming video URL or a local media
* file path.
*/
private String path = "http://www.boisestatefootball.com/sites/default/files/videos/original/01%20-%20coach%20pete%20bio_4.mp4";
private VideoView mVideoView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.videoview);
mVideoView = (VideoView) findViewById(R.id.surface_view);
runOnUiThread(new Runnable() {
public void run() {
playVideo();
}
});
}
private void playVideo() {
try {
// final String path = path;
Log.v(TAG, "path: " + path);
if (path == null || path.length() == 0) {
Toast.makeText(VideoViewDemo.this, "File URL/path is empty",
Toast.LENGTH_LONG).show();
} else {
// If the path has not changed, just start the media player
if (path.equals(current) && mVideoView != null) {
mVideoView.start();
mVideoView.requestFocus();
return;
}
current = path;
mVideoView.setVideoPath(getDataSource(path));
mVideoView.start();
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
}
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
if (mVideoView != null) {
mVideoView.stopPlayback();
}
}
}
private String getDataSource(String path) throws IOException {
if (!URLUtil.isNetworkUrl(path)) {
return path;
} else {
URL url = new URL(path);
URLConnection cn = url.openConnection();
cn.connect();
InputStream stream = cn.getInputStream();
if (stream == null)
throw new RuntimeException("stream is null");
File temp = File.createTempFile("mediaplayertmp", "dat");
temp.deleteOnExit();
String tempPath = temp.getAbsolutePath();
FileOutputStream out = new FileOutputStream(temp);
byte buf[] = new byte[128];
do {
int numread = stream.read(buf);
if (numread <= 0)
break;
out.write(buf, 0, numread);
} while (true);
try {
stream.close();
} catch (IOException ex) {
Log.e(TAG, "error: " + ex.getMessage(), ex);
}
return tempPath;
}
}
}
但它失败了
在安卓2.2中运行时,第一个代码运行,它显示安卓2.1中的错误(-38,0)
这个错误是什么??我查过了,但找不出这是什么错误
有人能指引我吗 您不需要获取整个视频,并将其保存在文件系统中,然后运行它..您提到的视频大小为32Mb,通过网络获取将花费大量时间。相反,您可以给videoview提供直接链接,它将逐步获取/缓冲视频并播放。您试图在UI线程中获取视频数据,这是不可接受的。这是正确的代码,你可以检查一下
public class VideoViewDemo extends Activity {
private static final String TAG = "VideoViewDemo";
private String current;
/**
* TODO: Set the path variable to a streaming video URL or a local media
* file path.
*/
private String path = "http://www.boisestatefootball.com/sites/default/files/videos/original/01%20-%20coach%20pete%20bio_4.mp4";
private VideoView mVideoView;
private Handler handler;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
handler = new Handler();
setContentView(R.layout.videoview);
mVideoView = (VideoView) findViewById(R.id.surface_view);
/* runOnUiThread(new Runnable() {
public void run() {
playVideo();
}
});
*/
playVideo();
Log.v(TAG, "activity oncreate finished");
}
private void playVideo() {
try {
// final String path = path;
Log.v(TAG, "path: " + path);
if (path == null || path.length() == 0) {
Toast.makeText(VideoViewDemo.this, "File URL/path is empty",
Toast.LENGTH_LONG).show();
} else {
// If the path has not changed, just start the media player
if (path.equals(current) && mVideoView != null) {
mVideoView.start();
mVideoView.requestFocus();
return;
}
current = path;
mVideoView.setVideoPath(path);
mVideoView.start();
mVideoView.setMediaController(new MediaController(VideoViewDemo.this));
mVideoView.requestFocus();
}
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
if (mVideoView != null) {
mVideoView.stopPlayback();
}
}
}
}
有一个按钮说“播放视频”,并在其单击功能中放置您的可运行线程代码。在OnCreate()函数中拥有自己的线程可能会变得混乱,如果处理不当,因为活动创建必须始终正常进行。顺便问一下,你是在安卓模拟器还是手机上试过这个?我在手机上试过@RahulSundar。我不想用这个按钮。我希望在进入活动时直接播放视频。这就是为什么我没有使用任何按钮。只是为了检查线程是否一切正常,从一个按钮启动它。然后在OnCreate()函数中使用相同的函数。为了确保视频渲染在活动创建完成后开始,请给予足够的延迟睡眠(5秒),并检查是否一切正常。@Rahusundar我会尝试一下。我用同样的逻辑来播放音频。它可以正常工作。@edwin,我的答案有用吗?谢谢你的代码!我还有一个问题,你知道视频被完全观看后是否会保存在设备上的某个地方吗?在那里可以到达吗?也请参阅我对这一问题的看法
public class VideoViewDemo extends Activity {
private static final String TAG = "VideoViewDemo";
private String current;
/**
* TODO: Set the path variable to a streaming video URL or a local media
* file path.
*/
private String path = "http://www.boisestatefootball.com/sites/default/files/videos/original/01%20-%20coach%20pete%20bio_4.mp4";
private VideoView mVideoView;
private Handler handler;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
handler = new Handler();
setContentView(R.layout.videoview);
mVideoView = (VideoView) findViewById(R.id.surface_view);
/* runOnUiThread(new Runnable() {
public void run() {
playVideo();
}
});
*/
playVideo();
Log.v(TAG, "activity oncreate finished");
}
private void playVideo() {
try {
// final String path = path;
Log.v(TAG, "path: " + path);
if (path == null || path.length() == 0) {
Toast.makeText(VideoViewDemo.this, "File URL/path is empty",
Toast.LENGTH_LONG).show();
} else {
// If the path has not changed, just start the media player
if (path.equals(current) && mVideoView != null) {
mVideoView.start();
mVideoView.requestFocus();
return;
}
current = path;
mVideoView.setVideoPath(path);
mVideoView.start();
mVideoView.setMediaController(new MediaController(VideoViewDemo.this));
mVideoView.requestFocus();
}
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
if (mVideoView != null) {
mVideoView.stopPlayback();
}
}
}
}