如何从资产文件夹加载视频? (用 VideoView 播放它们)

Posted

技术标签:

【中文标题】如何从资产文件夹加载视频? (用 VideoView 播放它们)【英文标题】:How to load videos from assets folder? (to play them with VideoView) 【发布时间】:2012-01-06 08:21:48 【问题描述】:

我需要从 assets 文件夹中打开一个 mp4 视频并使用 VideoView 播放。

我尝试了这两个选项,但它们都不起作用....

mVideoView.setVideoPath("file:///android_asset/videos.mp4");
mVideoView.requestFocus();
mVideoView.start();

还有……

String uriPath = "file:///android_asset/videos.mp4";
Uri uri = Uri.parse(uriPath);
mVideoView.setVideoURI(uri);
mVideoView.requestFocus();
mVideoView.start();

这些选项不起作用,但如果我尝试从 SDCARD 打开视频,它可以完美运行,那么问题是当我尝试从资产文件夹加载视频时。

我做错了什么?

谢谢

【问题讨论】:

【参考方案1】:

我不知道如何从资产文件夹加载视频。但我知道如何从 /res/raw/ 文件夹加载它们:

String uriPath = "android.resource://yourapplicationpackage/raw/videofilenamewithoutextension";
Uri uri = Uri.parse(uriPath);
video.setVideoURI(uri);

【讨论】:

我没有使用原始文件夹,我正在使用资产 只需将 raw 部分更改为 ** assets** .... 晚了,但对现在正在查看它的人会有所帮助 您好,我使用 VideoView 播放原始文件夹中的视频,但低于 2.3 的较低版本无法播放视频。它显示错误“无法播放视频”请指导我哪里有问题,因为视频在其他版本中播放。 @NidhiGondhia 试试这个:String uriPath = "android.resource://" + getPackageName() + "/" + R.raw.my_video_file; 是 com.abc.xyz 或类似 com/abc/xyz 的包名称吗?【参考方案2】:

已编辑

试试:

this.setContentView(R.layout.videoview);        
mVideoView = (VideoView) this.findViewById(R.id.surface_view);        
SurfaceHolder holder = mVideoView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
MediaPlayer player = new MediaPlayer();
player.setDisplay(holder);        
AssetFileDescriptor afd;
try 
    afd = getAssets().openFd("v.mp4");        
    player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
    player.prepareAsync();
    player.setOnPreparedListener(new OnPreparedListener() 

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

 catch (Exception e)  e.printStackTrace();   

【讨论】:

我没有使用 MediaController,因为我需要隐藏 videoview 的控件....然后我不知道如何将文件描述符分配给 videoView 对象。 also.... 方法 setDataSource(FileDescriptor, long, long) 对于 MediaController 类型未定义 当你第一次问这个问题时,MediaController。现在我很困惑你的代码实际上是什么样的 我现在尝试使用 MC 并且... 方法 setDataSource(FileDescriptor, long, long) 对于 MediaController 类型未定义 我试图让你的代码工作,但我做不到,我不明白如何用我的代码来识别你的代码....我不知道我做错了什么。我编辑了我的问题,检查一下。【参考方案3】:

无法从\assets 播放.mp4 文件,您必须从\raw 文件夹加载它。

例子:

如果您在/raw 文件夹中有一个名为video.mp4 的文件:

String fileName = "android.resource://"+  getPackageName() + "/raw/video";
VideoView vv = (VideoView) this.findViewById(R.id.surface);
vv.setVideoURI(Uri.parse(fileName));
vv.start();

【讨论】:

经过几个小时的搜索,这是解决我问题的唯一答案!非常感谢! 问题是关于assets。不是raw 这是不可能的,所以我给了另一个选择。 有可能!刚刚给了asset:///youvideo.mp4

以上是关于如何从资产文件夹加载视频? (用 VideoView 播放它们)的主要内容,如果未能解决你的问题,请参考以下文章

无法从嵌套组件中的资产文件夹加载图像(Vue.js 2.0 / Webpack)

无法加载资产颤振(不是资产是保存的文件)

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

如何从资源文件夹动态加载资产到公用文件夹并使用asset()助手访问它们

从颤振资产加载 .pdf 文件/自定义文件

如何从 webpack 生成的 NPM 包中正确加载资产?