如何从远程URL在Android模拟器中显示视频?

时间:2009-09-15 06:45:38

标签: android

我使用以下代码在Android模拟器中显示视频文件,当视频文件存储在SD卡中时,它可以正常工作。但是,当我给视频的任何URL提供代码时,代码不起作用。

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.View;
import android.widget.*;

public class playerActivity extends Activity 
{
Button b;
VideoView preview;
SurfaceHolder holder;
MediaPlayer mp;

 private String path = "/data/data/payoda.android/funny.mp4";

//private String path = "http://www.daily3gp.com/vids/3.3gp";

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    preview=(VideoView)findViewById(R.id.surface);
    holder=preview.getHolder();
    b=(Button)findViewById(R.id.cmd_play);
    b.setOnClickListener(new View.OnClickListener()
    {
    public void onClick(View v)
    {
        try
        {
                mp=new MediaPlayer(); 
                mp.setDataSource(path);
                mp.setScreenOnWhilePlaying(true);
                mp.setDisplay(holder);
                mp.prepare();
                mp.start();
        }
        catch(Exception e)
        {

        }
    }
    });
}
}

The Exception thorwn是:

prepare failed:
status=0xC8

LogCat的详细信息是:

09-16 12:16:36.729: ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info PVMFErrContentInvalidForProgressivePlayback
09-16 12:16:36.739: ERROR/MediaPlayer(2867): error (200, -27)

在上面的代码中,如果更改路径变量,则模拟器屏幕为黑色,单个按钮。可能我需要做更多的事情来显示远程URL中的视频,我不知道该怎么做。任何人都有关于这个的想法请帮助我。

3 个答案:

答案 0 :(得分:4)

首先,请勿使用模拟器测试视频播放。它处理视频播放的能力非常有限。使用实际的Android设备。

其次,在遇到多媒体问题时,请始终检查LogCat(Eclipse中的adb logcat,DDMS或DDMS透视图)以获取警告。 OpenCORE-- Android使用的多媒体引擎 - 倾向于将错误级别的条件记录为警告。

例如,您的视频文件可能未设置为渐进式下载,这是HTTP流式传输所必需的。在Linux上,您可以通过安装MP4Box并运行MP4Box -hint <file>来修补MP4视频以进行渐进式下载。

答案 1 :(得分:2)

你应该在模拟器中创建一个Sdcard 然后将您的eclipse窗口视图更改为DDMS 选择mnt / sdcard的路径并将文件推送到设备上 动作按钮是DDMS的右上角,它是一个电话图标

然后更改.java路径

private String path = "mnt/sdcard/funny.mp4";

你应该继续努力。

答案 2 :(得分:0)

您还应该使用prepareAsync()方法而不是prepare()。使用prepare()是一个阻塞调用(UI被锁定),而prepareAsync不是阻塞调用。