8

我正在尝试播放我保存在项目中的视频。我已经下载了这个 (一个 .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" />

PlayLocalVideo 是我在按钮的 onclick 事件上使用的一种方法。但是当我按下播放时没有任何反应:(

4

3 回答 3

12

只需将文件粘贴到res/raw/big_buck_bunny.mp4而不是 vid 文件夹并将 videoPath 更改为:

video.setVideoPath("android.resource://" + getPackageName() + "/" + R.raw.big_buck_bunny);
于 2013-02-05T15:38:18.123 回答
1

问题可能出在 Android OS 缺陷,它不允许您正常访问超过 1Mb 大小的文件 从 assets 文件夹加载大于 1M 的文件

您可能需要将视频文件拆分为 1Mb 大小的部分。然后将这些部分合并到sdcard上的一个文件中并播放。

例如,我已经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();
}
于 2013-02-05T15:49:15.293 回答
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();
于 2013-12-05T11:03:58.513 回答