【问题标题】:How to play videos in android from assets folder or raw folder?如何从资产文件夹或原始文件夹在android中播放视频?
【发布时间】:2011-03-03 00:07:45
【问题描述】:

我正在尝试在 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

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

【问题讨论】:

  • 我认为问题在于 mp4 是一种压缩格式。详情查看我的回答
  • 这里解释'原始' floder stackoverflow.com/questions/11356601/…
  • 那年是2020年,虽然我用的是android studio 3.6,Android 10操作系统,但是下面的videoview有音频,但是图片是黑色的。最后,这位朋友的代码奏效了,我无法解释我有多高兴。写成以下解决方案的那些都不是第一次在我身上起作用。幸运的是,我很高兴终于解决了我的问题。谢谢:D

标签: android video assets


【解决方案1】:

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

## Check complete tutorial ##

【讨论】:

  • 重要提示:要使用R.raw 路径,您必须将视频放在“res/raw”文件夹中,而不是放在“assets”下。
  • 这里的“R”是什么?又名R.raw? R 变量的类型或这个是什么类型?
  • 它在 micromax canvas 4 上不起作用,而是给出 StringIndexOutofBound 异常
  • 也 - 仅适用于原生 Android 支持的视频格式
  • 如果你不调用 getWindow().setFormat(PixelFormat.TRANSLUCENT);,请确保你调用 videoView.setZOrderOnTop(true);在播放视频之前先在你的videoview上,否则它会出现在你的views后面,你会很困惑;如果您收到错误(-21851621),那么您需要重新编码您的 H264 文件(例如 H264 与 LEAWO Total Media Converter 一起为我工作)
【解决方案2】:
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name;
videocontainer.setVideoURI(Uri.parse(UrlPath));
videocontainer.start();

videoview 类型的视频容器。

【讨论】:

    【解决方案3】:

    试试:

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

    【讨论】:

    • 在 API 级别 24 中添加了 AssetFileDescriptor 版本的 setDataSource; OP 要求在 android 2.3 上运行的东西。
    【解决方案4】:

    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>
    

    【讨论】:

      【解决方案5】:

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

      所以,解决方案:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          我找到了:

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

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

          【讨论】:

            【解决方案8】:
            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】:

            我认为你需要看看this——它应该有你想要的一切。

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

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

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

            【讨论】:

            • 嘿,谢谢老兄,但我已经看了这个页面上百万次并且使用了这行代码。它确实播放音频文件,但不播放视频,我认为这与 videoview 和资产或原始文件夹有关。如果您有任何想法,请随时分享或一段代码。
            • 如果我调用 MediaPlayer.create(contect, R.raw.video) 我会在 MediaPlayer 类中得到相同的异常,就像我自己使用文件描述符准备 Mediaplayer 一样。
            【解决方案10】:

            听起来你可能和我有同样的问题。代替使用 MP4,3GPP 可能吗?我想我用过 HandBrake 之类的视频转换器……你只需要确保你有正确的编码器,比如 H.264x 或其他东西。抱歉有点含糊,已经有一段时间了。另外,如果可能的话,不要再担心 android 2.1 了,而且,有些东西在模拟器中将无法工作。所以如果它适用于很多设备,那么就假设它适用(尤其是与不同的制造商)

            在这里,您可以阅读我的问题以及我是如何解决问题的(经过很长时间,没有人给出答案)。我在这里更详细地解释了: android media player not working

            【讨论】:

              【解决方案11】:

              fileName中必须放文件的相对路径(不带/asset) 例如:

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

              【讨论】:

                【解决方案12】:
                1. 使用MediaPlayer API 和示例代码。

                2. 将媒体文件放入raw文件夹。

                3. file descriptor 获取到文件中。

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

                5. 那么当onPreared,mediaplayer.start();

                【讨论】:

                • ok thnx 我会试试这个,但您能否提供一些非常有用的示例代码。再次感谢
                • 不起作用,请查看问题以获得解释。
                【解决方案13】:

                主代码

                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。
                • 是的......这个解决方案不起作用。但是,如果 URI 指向 2130968576 是可以的,因为这是资源 ID,这是创建可用 URI 的合法方式。
                • 尝试检查您的代码。也许它似乎对你有用,@Sandeep。但是,这可能不足以解决它。
                猜你喜欢
                • 1970-01-01
                • 2012-06-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多