Android:使用MediaPlayer播放本地视频

11

我正在尝试播放我保存在项目中的视频。我已经下载了这个(一个 .mp4 测试视频),然后在项目的根目录下创建了一个名为 vid 的文件夹。然后我使用了以下代码:

public void PlayLocalVideo(View view)
    {
    VideoView video=(VideoView) findViewById(R.id.video1);
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(video);
    video.setMediaController(mediaController);
    video.setKeepScreenOn(true);
    video.setVideoPath("android.resource://uk.co.SplashActivity/vid/big_buck_bunny.mp4");
    video.start();
    video.requestFocus();
}

我的xml长这样:

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

我在一个按钮的onclick事件上使用了PlayLocalVideo方法,但是当我点击播放时什么也没有发生 :(

3个回答

13
只需将文件粘贴到 res/raw/big_buck_bunny.mp4 而不是vid文件夹中,并将您的videoPath更改为:
video.setVideoPath("android.resource://" + getPackageName() + "/" + R.raw.big_buck_bunny);

如果视频损坏了,我应该能够看到一个VideoView吗?我在XML中将按钮放在VideoView上方,但下面似乎没有任何东西。 - user987723

1

问题可能出在Android操作系统的缺陷上,它不允许你正常访问超过1MB大小的文件 从assets文件夹加载大于1MB的文件

你可能需要将视频文件拆分成1MB大小的部分,然后在sd卡上将这些部分合并为一个文件并播放它。

例如,我已经将big_buck_bunny.mp4分成了5个部分big_buck_bunny.mp4.part0big_buck_bunny.mp4.part1等等。要合并它们,你可以使用这个方法。

private void copyVideoFromAssets(String inFilePrefix, String outFileName) throws IOException {
    // Get list of files in assets and sort them
    final String[] assetsFiles = getAssets().list("");
    Arrays.sort(assetsFiles);

    // Open the empty file as the output stream
    final OutputStream output = new FileOutputStream(outFileName);
    byte[] buffer = new byte[1024 * 128];

    for (String file: assetsFiles) {
        if (file.startsWith(inFilePrefix)) {
            // Open part of file stored in assets as the input stream
            final InputStream input = getAssets().open(file);

            // Transfer bytes from the input file to the output file
            int length = input.read(buffer);
            while (length > 0) {
                output.write(buffer, 0, length);
                length = input.read(buffer);
            }
            input.close();
        }
    }

    // Close the streams
    output.flush();
    output.close();
}

public void PlayLocalVideo(View view)
    try {
        copyVideoFromAssets("big_buck_bunny.mp4.part", "/mnt/sdcard/big_buck_bunny.mp4");
    } catch (IOException e) {
        e.printStackTrace();
    }

    VideoView video=(VideoView) findViewById(R.id.video);
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(video);
    video.setMediaController(mediaController);
    video.setKeepScreenOn(true);
    video.setVideoPath("/mnt/sdcard/big_buck_bunny.mp4");
    video.start();
    video.requestFocus();
}

当数据已经压缩(例如.mp4)时,此问题不会发生。 - Indrek Kõue

1

请尝试以下代码......

首先在res目录下创建名为raw的文件夹,在该文件夹中复制您的视频,并尝试以下代码......

    video1=(VideoView)findViewById(R.id.myvideoview);
    video1.setVideoURI(Uri.parse("android.resource://" +getPackageName()+ "/"+R.raw.YOUR_VIDEO_FILE_NAME));
    video1.setMediaController(new MediaController(this));
    video1.requestFocus();
    video1.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接