首页 文章

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

提问于
浏览
64

我正在尝试在Android模拟器中播放视频我在我的资源文件夹中的视频以及原始文件夹但是在做了一些研究后仍然无法在我的模拟器中播放视频我正在使用android 2.1我的视频格式是mp4所以我不要认为这应该是一个问题任何人都可以给我一个示例代码,以便我可以了解更多?

问题是我需要显示视频的VideoView只会使用URI或文件路径指向视频 .

如果我将视频保存在raw或assets文件夹中,我只能获得输入流或文件描述符,似乎没有什么可用于初始化VideoView .

Update

我仔细研究了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 回答

  • 10

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

    player.setDataSource(
        getAssets().openFd(**"media/video.mp4"**).getFileDescriptor()
    );
    
  • 109
    • 使用 MediaPlayer API和示例代码 .

    • 将媒体文件放在 raw 文件夹中 .

    • 获取 file descriptor 到该文件 .

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

    • 然后当 onPrearedmediaplayer.start();

  • 3

    ## 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 ##

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

    视频视频类型的视频容器 .

  • -1

    尝试:

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

    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>
    
  • 11

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

    所以,解决方案:

    • 将文件的扩展名更改为.mp3或.png,看看它是否有效

    • 手动构建您的应用程序并使用zip-0选项

  • 0

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

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

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

  • 4

    我找到了 :

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

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

  • 0

    我认为你需要看看this - 它应该拥有你想要的一切 .

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

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

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

  • 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

  • 8

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

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

  • 2

    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>
    

相关问题