71

我正在尝试在 android 模拟器中播放视频我的资产文件夹和 raw 文件夹中有视频但是在做了一些研究之后我仍然无法在我的模拟器中播放视频我正在使用 android 2.1 我的视频格式是 mp4 所以我不认为这应该是一个问题 谁能给我一个示例代码,以便我能理解更多?

问题是我需要显示视频的 VideoView 只需要一个 URI 或文件路径来指向视频。

如果我将视频保存在 raw 或 assets 文件夹中,我只能获取输入流或文件描述符,而且似乎没有任何内容可用于初始化 VideoView。

更新

我仔细查看了 MediaPlayer 示例,并尝试使用 FileDescriptor 对资产文件启动 MediaPlayer,如下面的代码所示:

SurfaceView videoView = (SurfaceView) findViewById(gettingStarted)
SurfaceHolder holder = videoView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
final MediaPlayer player = new MediaPlayer();
player.setDisplay(holder);

player.setDataSource(getAssets().openFd(fileName).getFileDescriptor());
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() {

   @Override
   public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

现在我得到以下异常:

java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

似乎没有其他方法可以在启动时将文件复制到 sdcard,这似乎是在浪费时间和内存。

4

13 回答 13

122

## 自 Android 1.6 起完美运行 ##

getWindow().setFormat(PixelFormat.TRANSLUCENT);
VideoView videoHolder = new VideoView(this);
//if you want the controls to appear
videoHolder.setMediaController(new MediaController(this));
Uri video = getUriFromRawFile(context, R.raw.your_raw_file);
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

接着

public static Uri getUriFromRawFile(Context context, @ResRaw int rawResourceId) {
    return Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(context.getPackageName())
        .path(String.valueOf(rawResourceId))
        .build();
}

##查看完整教程##

于 2011-12-23T12:40:09.680 回答
12
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

其中videoview类型的videocontainer。

于 2013-03-05T14:11:42.603 回答
11

尝试:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
于 2011-08-25T18:54:28.260 回答
10

PlayVideoActivity.java:

public class PlayVideoActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video);

        VideoView videoView = (VideoView) findViewById(R.id.video_view);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.documentariesandyou));
        videoView.start();
    }
}

活动播放视频.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </VideoView>

</LinearLayout>
于 2013-12-18T08:05:55.640 回答
4

如果我没记错的话,我在从资产文件夹加载内容但使用数据库时遇到了同样的问题。您的资产文件夹中的东西似乎可以有 2 个统计信息:压缩与否。
如果它被压缩了,那么你可以使用 1 Mo 的内存来解压它,否则你会得到这种异常。有几个错误报告关于这一点,因为文档不清楚。因此,如果您仍想使用您的格式,则必须使用未压缩的版本,或者为文件提供 .mp3 或 .png 之类的扩展名。我知道这有点疯狂,但我加载了一个扩展名为 .mp3 的数据库,它工作得非常好。这个另一种解决方案是用一个特殊的选项来打包你的应用程序,告诉它不要压缩某些扩展。但是您需要手动构建您的应用程序并添加“zip -0”选项。
未压缩资产的优点是发布应用程序之前的 zip-align 阶段将正确对齐数据,以便在加载到内存时可以直接映射。

所以,解决方案:

  • 将文件的扩展名更改为 .mp3 或 .png 并查看是否有效
  • 手动构建您的应用程序并使用 zip-0 选项
于 2010-08-21T09:33:50.680 回答
3

您是否尝试在 SDCard 上手动放置 Video 并尝试在 SDCard 上播放视频存储?

如果它正常工作,您可以在此处找到从 Raw 复制到 SDcard 的方法:

android-copy-rawfile-to-sdcard-video-mp4

于 2010-08-16T23:27:33.057 回答
2

我找到了 :

Uri raw_uri = Uri.parse(<package_name>/+R.raw.<video_file_name>);

Personnaly Android 找到了资源,但暂时无法播放。我的文件是 .m4v

于 2011-12-05T15:27:16.017 回答
2
VideoView myVideo = (VideoView) rootView.findViewById(R.id.definition_video_view);

//Set video name (no extension)
String myVideoName = "my_video";

//Set app package
String myAppPackage = "com.myapp";

//Get video URI from raw directory
Uri myVideoUri = Uri.parse("android.resource://"+myAppPackage+"/raw/"+myVideoName);

//Set the video URI
myVideo.setVideoURI(myVideoUri);

//Play the video
myVideo.start();

https://gist.github.com/jrejaud/b5eb1b013c27a1f3ae5f

于 2015-12-02T20:30:51.537 回答
1

我认为你需要看看这个——它应该有你想要的一切。

编辑:如果您不想查看链接 - 这几乎总结了您想要的内容。

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1); mp.start();

但我仍然建议阅读链接中的信息。

于 2010-06-12T19:54:05.667 回答
0

在中,fileName您必须放置文件的相对路径(不带/asset),例如:

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);
于 2011-12-10T14:13:43.767 回答
0

听起来你可能和我有同样的问题。代替使用 MP4,3GPP 可能吗?我想我用过 HandBrake 之类的视频转换器……你只需要确保你有正确的编码器,比如 H.264x 或其他东西。抱歉有点含糊,已经有一段时间了。另外,如果可能的话,不要再担心 android 2.1 了,而且,有些东西在模拟器中将无法工作。因此,如果它适用于很多设备,那么就假设它有效(尤其是与不同的制造商)

在这里,您可以阅读我的问题以及我是如何解决问题的(经过很长时间,没有人回答)。我在这里更详细地解释了: android media player not working

于 2012-01-20T06:42:05.940 回答
0
  1. 使用MediaPlayerAPI 和示例代码。

  2. 将媒体文件放入文件raw夹中。

  3. 获取file descriptor文件。

  4. mediaplayer.setDataSource(fd,offset,length);- 它是一个三参数构造函数。

  5. 那么当onPrearedmediaplayer.start();

于 2010-06-13T09:50:32.337 回答
-2

主代码

Uri raw_uri=Uri.parse("android.resource://<package_name>/+R.raw.<video_file_name>);

myVideoView=(VideoView)findViewbyID(R.idV.Video_view);

myVideoView.setVideoURI(raw_uri);
myVideoView.setMediaController(new MediaController(this));
myVideoView.start();
myVideoView.requestFocus();

XML

<?xml version="1.0" encoding="utf-8" ?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <VideoView
            android:id="+@/Video_View"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        />
</LinearLayout>
于 2010-07-01T13:41:16.203 回答