如何从资源文件夹或原始文件夹中播放android中的视频?

时间:2010-06-12 12:54:19

标签: android video assets

我正在尝试在Android模拟器中播放视频 我的资源文件夹中的视频以及原始文件夹 但经过一些研究后,我仍然无法在我的模拟器中播放视频 我正在研究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

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

13 个答案:

答案 0 :(得分:113)

## Perfectly Working since 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 = Uri.parse("android.resource://" + getPackageName() + "/" 
+ R.raw.your_raw_file); //do not add any extension
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

## Check complete tutorial ##

答案 1 :(得分:11)

String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

视频类型的视频容量。

答案 2 :(得分:10)

尝试:

AssetFileDescriptor afd = getAssets().openFd(fileName);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());

答案 3 :(得分:8)

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();
    }
}

<强> activity_play_video.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>

答案 4 :(得分:4)

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

所以,解决方案:

  • 将文件的扩展名更改为.mp3或.png并查看其是否有效
  • 手动构建您的应用并使用zip-0选项

答案 5 :(得分:3)

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

如果它正常工作,你可以在这里找到从Raw复制到SD卡的方法:

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

答案 6 :(得分:2)

我找到了它:

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

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

答案 7 :(得分:1)

我认为您需要查看this - 它应该包含您想要的一切。

编辑:如果你不想看这个链接 - 这几乎总结了你想要的东西。

  

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

  1. 使用MediaPlayer API和示例代码。

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

  3. 获取file descriptor到该文件。

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

  5. 然后onPrearedmediaplayer.start();

答案 10 :(得分:0)

fileName中,您必须将相对路径放到文件中(不含/asset) 例如:

player.setDataSource(
    getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
);

答案 11 :(得分:0)

听起来可能就像你和我一样有同样的问题。而不是使用MP4,3GPP可能吗?我想我像HandBrake一样用作视频转换器...你只需要确保你有合适的编码器,比如H.264x或其他东西。抱歉有点模糊,已经有一段时间了。此外,如果可能的话,不要再担心Android 2.1了,而且,某些东西在EMULATOR中也不会起作用。所以如果它适用于很多设备,那么就假设它有效(特别是对于不同的制造商)

在这里,你可以阅读我的问题以及我是如何解决这个问题的(经过很长一段时间没有人得到答案)。我在这里解释了很多细节: android media player not working

答案 12 :(得分:-1)

MainCode

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>