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


70

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

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


我认为问题是因为mp4是压缩格式。检查我的答案以获取详细信息
Sephy 2010年

这里解释有关“原始” floder stackoverflow.com/questions/11356601/...
罗马中号

1
那是2020年,尽管我使用的是Android Studio 3.6,Android 10操作系统,但以下视频视图中有音频,但图像为黑色。最后,这个朋友的密码有效,我无法解释自己有多高兴。以下解决方案中没有一个是第一次对我起作用。幸运的是,我很高兴能最终解决我的问题。谢谢:d
GörkemKARA

Answers:


120

##自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 = getUriFromRawFile(context, R.raw.your_raw_file);
//if your file is named sherif.mp4 and placed in /raw
//use R.raw.sherif
videoHolder.setVideoURI(video);
setContentView(videoHolder);
videoHolder.start();

接着

public static Uri getUriFromRawFile(Context context, @ResRaw int rawResourceId) {
    return Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(context.getPackageName())
        .path(String.valueOf(rawResourceId))
        .build();
}

##查看完整的教程##


9
重要说明:要使用R.raw路径,必须将视频放置在“ res / raw”文件夹中,而不是在“ assets”下。
肯特

这里的“ R”是什么?aka R.raw?R变量的类型是什么?
比亚里克斯

它不能在micromax canvas 4上工作,而是给StringIndexOutofBound例外
Pranav 2013年

另外-仅适用于原生Android支持的视频格式
Vaiden 2013年

1
如果不调用getWindow()。setFormat(PixelFormat.TRANSLUCENT);,请确保调用videoView.setZOrderOnTop(true);。在播放视频之前先在视频视图上播放,否则它将显示在视图后面,您会感到非常困惑;如果出现错误(-21851621),则需要重新编码H264文件(例如,H264在LEAWO Total Media Converter中对我有用)
EpicPandaForce 2015年

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

其中videoview类型的videocontainer。


10

尝试:

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

2
APIAssetFileDescriptor版本setDataSource24中添加了的版本;OP要求提供适用于android 2.3的功能。
Ernest3.14 '16

10

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

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

因此,解决方案:

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


2

我找到了 :

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

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


2
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


我试过了,但是在软心豆粒糖中不起作用。我不知道是否只是因为我的电话。但它适用于更新的设备。
Kairi San

1

我认为你需要看看这个-它应该有你想要的一切。

编辑:如果您不想看链接-这几乎总结了您想要的内容。

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

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


嘿,谢谢花花公子,但我浏览该页面已有近百万次,并使用了这一行代码。它确实播放音频文件,但不播放视频,我认为与videoview和资产或原始文件夹有关。如果您有任何想法,请随时分享或编写一段代码。
Abhishek Talwar

如果我调用MediaPlayer.create(contect,R.raw.video),我会在MediaPlayer类中遇到相同的异常,就好像我自己准备了带文件描述符的Mediaplayer一样。
Janusz

0

听起来您可能和我有同样的问题。代替使用MP4,3GPP是否可行?我想我曾经使用过像HandBrake之类的东西作为视频转换器...您只需要确保您拥有正确的编码器,例如H.264x之类的东西即可。抱歉,我有点模糊了,已经有一段时间了。另外,如果可能的话,不必再担心android 2.1了,而且,某些事情在仿真器中将无法使用。因此,如果它在很多设备上都可以工作,那么就假设它可以工作(尤其是在不同的制造商那里)

在这里,您可以阅读我的问题以及我如何解决该问题(经过很长时间,没有人得到答案)。我在这里更详细地解释了: Android Media Player无法正常工作


0

在中,fileName您必须输入文件的相对路径(不带/asset),例如:

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

0
  1. 使用MediaPlayerAPI和示例代码。

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

  3. 获取file descriptor文件。

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

  5. 然后onPrearedmediaplayer.start();


好的,我会尝试的,但是请您提供一些示例代码对我很有帮助。再次感谢
Abhishek Talwar 2010年

不起作用,请看问题作一解释。
Janusz

-1

主码

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>

这根本不起作用。在我的情况下,Uri仅指向/ 2130968576。
Janusz

是的。此解决方案不起作用。但是,指向2130968576的URI可以,因为这是资源ID,并且是创建可用URI的合法方法。
克里斯蒂安

尝试检查您的代码。@Sandeep似乎对您有用。但是,这可能不足以解决它。
David Dimalanta 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.