Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 仅将视频加载到VideoView而不立即播放_Android_Video_Android Videoview - Fatal编程技术网

Android 仅将视频加载到VideoView而不立即播放

Android 仅将视频加载到VideoView而不立即播放,android,video,android-videoview,Android,Video,Android Videoview,我有一个问题,在安卓系统中,是否可以在不立即开始播放的情况下将视频数据加载到视频视图中?如果是这样,我该怎么做?VideoView不会自动开始播放,至少如果您连接了MediaController。您需要调用start(),让它开始播放。因此,如果您不希望它开始播放,请不要调用start()当活动开始时,我还希望我的视频视图处于暂停状态。我找不到一个简单的方法让VideoView显示视频的第一帧(非黑色) 作为一种解决方法,我从视频资源中创建了一个位图缩略图,然后将该缩略图作为活动开始时Video

我有一个问题,在安卓系统中,是否可以在不立即开始播放的情况下将视频数据加载到
视频视图中?如果是这样,我该怎么做?

VideoView
不会自动开始播放,至少如果您连接了
MediaController
。您需要调用
start()
,让它开始播放。因此,如果您不希望它开始播放,请不要调用
start()

当活动开始时,我还希望我的视频视图处于暂停状态。我找不到一个简单的方法让VideoView显示视频的第一帧(非黑色)

作为一种解决方法,我从视频资源中创建了一个位图缩略图,然后将该缩略图作为活动开始时VideoView的背景。然后,当视频开始播放时,您只需清空背景(否则,您正在播放的视频将隐藏在背景图像后面)

无论你的按钮在哪里,你都可以做类似的事情

    mPlay.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            if(!isPlaying){
                keepScreenOn();
                mPlay.setText("Pause");

                // make sure to null the background so you can see your video play
                mVideoView.setBackgroundDrawable(null);

                mVideoView.start();
                isPlaying = true;
            } else {
                mPlay.setText("Play");
                mVideoView.pause();
                isPlaying = false;
            }
        }
    });

我使用MediaController作为我的播放按钮,所以我使用下面的链接和这个背景位图作为我的解决方案


我建议您使用以下代码,其中我正在成功运行我的应用程序

代码如下:

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f0f0f0" >

    <Button
        android:id="@+id/btnVideoGallery"
        android:layout_width="75dp"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:text="@string/gallery" />

    <Button
        android:id="@+id/btnCancel"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnVideoGallery"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="22dp"
        android:text="@string/cancel" />

    <TextView
        android:id="@+id/lblDisplayImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnCancel"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="@string/below_this_text_video_will_be_displayed"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#000000"
        android:textSize="13dp" />

    <VideoView
        android:id="@+id/vvDisplayVideo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lblDisplayImage"
        android:layout_marginTop="15dp" />

</RelativeLayout>
此外,您还可以根据自己的用途修改清单文件:

<manifest>
    ...
    <uses-sdk...  />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <application>...</application>

</manifest>

...
...

我也在考虑像斯盖尔所说的那样展示一个土钉。但我认为这可能会导致性能下降

所以我现在要做的就是打电话

videoView.seekTo(1);

将视频转发到第一毫秒。这对我来说很好,实现起来也很快。

我发现可以启动视频,等待1毫秒,然后暂停:

mediaController = new MediaController(this);
//set the path for video here                        
Uri video = Uri.parse(tempPath);
//set the VideoView id in xml file here    
vv_item = (VideoView) findViewById(R.id.itemdetails_vv_item);
vv_item.setMediaController(mediaController);
vv_item.setVideoURI(video);
vv_item.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        //first starting the video, when loaded
        vv_item.start();
        //then waiting for 1 millisecond
        try {
            Thread.sleep(1);
        } 
        catch (InterruptedException e) {
            //     TODO Auto-generated catch block
            e.printStackTrace();
        }
        //then pausing the video. i guess it's the first frame
        vv_item.pause();
        //showing the control buttons here                          
        mediaController.show();
    }
});

我发现在所有的设备上仅仅做
VideoView.seekTo(n)
并不足以显示视频的第一帧

如果只需显示第一帧,而不播放视频,则可以执行此操作,这有助于渲染视频的缩略图:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(context, uri);
Bitmap firstFrame = MediaMetadataRetriever.getFrameAtTime(0);
// Set firstFrame bitmap to ImageView...
但是,为了在渲染后的某个时间点(例如从用户交互)可靠地显示第一帧,我的解决方案是注册一个
OnPreparedListener
,然后调用
start()
。我还注册了一个
onInfo Listener
,以便在渲染开始时收到通知。然后检查信息是否确实是“渲染开始”事件,并检查这是否是
VideoView
第一次开始渲染。如果是这样的话,我将暂停()
,然后
seekTo(0)

下面是它的外观:

private void showFirstFrame(final VideoView videoView, Uri uri) {
  videoView.setVideoURI(uri);

  final AtomicBoolean showedFirstFrame = new AtomicBoolean(false);

  videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
      // If this is our first time starting video rendering, pause and show first frame
      if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START
          && showedFirstFrame.compareAndSet(false, true)) {
        videoView.pause();
        videoView.seekTo(0);
      }

      return false;
    }
  });

  videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
      videoView.start();
    }
  });
}

我现在唯一的问题是视频根本不在视图中显示,我的意思是我希望它显示(只有第一帧)并在其下方有控件(播放/暂停、停止、前进和后退)…
MediaController
是一个弹出的东西——用户必须点击你的
VideoView
才能显示它。如果您想要始终可见的控件,您可能必须自己执行。有关使用
MediaPlayer
和带有自定义“控制器”面板的
SurfaceView
的项目,请参阅。关于第一帧,除了开始播放,您没有办法强制显示该帧,好吧。我如何知道视频何时加载?所以,我可以处理一些其他的动作或者向用户展示一些东西。@ XAIF:我不知道你认为“加载”是什么意思,但是有一个惯常的工作,因为视频必须处于回放状态。<代码> Sekto(1)< /C> >对我来说似乎很重要。如果不进行搜索,我的视频将在调用
start()
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(context, uri);
Bitmap firstFrame = MediaMetadataRetriever.getFrameAtTime(0);
// Set firstFrame bitmap to ImageView...
private void showFirstFrame(final VideoView videoView, Uri uri) {
  videoView.setVideoURI(uri);

  final AtomicBoolean showedFirstFrame = new AtomicBoolean(false);

  videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
      // If this is our first time starting video rendering, pause and show first frame
      if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START
          && showedFirstFrame.compareAndSet(false, true)) {
        videoView.pause();
        videoView.seekTo(0);
      }

      return false;
    }
  });

  videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
      videoView.start();
    }
  });
}