У меня вопрос, можно ли в Android загружать видеоданные в VideoView
без его немедленного начала? Если да, то как я могу это сделать?Загрузка видео в VideoView без мгновенного проигрывания
ответ
VideoView
не начнет воспроизведение автоматически, по крайней мере, если у вас есть MediaController
. Вам нужно позвонить start()
, чтобы начать воспроизведение. Следовательно, если вы не хотите, чтобы он начал воспроизведение, не вызывайте start()
.
Я также хотел, чтобы мой VideoView находился в состоянии паузы, когда действие началось. Я не мог найти простой способ показать VideoView первый (не черный) кадр видео.
Как обходной путь, я создал растровое изображение из видеоресурса, а затем поместил его в качестве фона в VideoView при запуске активности. Затем, когда видео начинает воспроизводиться, вам нужно только обнулить фон (иначе ваше воспроизводимое видео скрыто за фоновым изображением).
Bitmap thumbAsBitmap = null;
BitmapDrawable thumbAsDrawable = null;
private String current;
private void setupVideo() {
try {
setVideoFilePath();
if (current == null || current.length() == 0) {
Toast.makeText(PreviewMessage.this, "File URL/path is empty",
Toast.LENGTH_LONG).show();
} else {
keepScreenOn();
mVideoView.setVideoPath(getDataSource(current));
mVideoView.setOnCompletionListener(this);
// create and place a thumbnail for the start state
thumbAsBitmap = ThumbnailUtils.createVideoThumbnail(current, MediaStore.Images.Thumbnails.MINI_KIND);
thumbAsDrawable = new BitmapDrawable(thumbAsBitmap);
mVideoView.setBackgroundDrawable(thumbAsDrawable);
mVideoView.pause();
isPlaying = false;
}
} catch (Exception e) {
if (mVideoView != null) {
mVideoView.stopPlayback();
}
}
}
Тогда везде, где ваш playbutton, вы можете сделать что-то вроде
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 для моей кнопки воспроизведения, так что я использовал ниже ссылку ответа в сочетании с этим фоновым изображением для моего решения.
Event for VideoView playback state or MediaController play/pause
I suggest you for the following Code wherein i am running my application successfully
The Code is as Follows:
XML file:
<?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>
Java File:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoActivity extends Activity {
private Button btnVideoGallery,btnCancel;
private VideoView vvDisplayVideo;
/** The Constant PICK_VIDEO. */
private static final int PICK_VIDEO=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_options);
btnVideoGallery=(Button)findViewById(R.id.btnVideoGallery);
vvDisplayVideo=(VideoView)findViewById(R.id.vvDisplayVideo);
btnCancel=(Button)findViewById(R.id.btnCancel);
vvDisplayVideo.setVisibility(View.GONE);
btnVideoGallery.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent video=new Intent();
video.setAction(Intent.ACTION_PICK);
video.setType("video/*");
startActivityForResult(video, PICK_VIDEO);
}
});
btnCancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(goStartUp);
finish();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (resultCode==Activity.RESULT_OK && requestCode == PICK_VIDEO) {
vvDisplayVideo.setVisibility(View.VISIBLE);
vvDisplayVideo.setVideoURI(data.getData());
vvDisplayVideo.setFocusable(true);
MediaController mc=new MediaController(this);
vvDisplayVideo.setMediaController(mc);
Log.i("True", "Executed");
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(goStartUp);
finish();
return super.onKeyDown(keyCode, event);
}
}
Also you can modify the Manifest File as per your use:
<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>
Я также думал о том, показывающей thunbnail, как указано sghael. Но я думаю, что это может привести к снижению производительности.
Так что я делаю сейчас просто называют
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()
. Я также регистрирую OnInfoListener
, чтобы я мог быть уведомлен о начале рендеринга. Затем я проверяю, действительно ли информация является событием «начало рендеринга», и я проверяю, является ли это первым запуском рендеринга VideoView
. Если да, то я pause()
, а затем 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();
}
});
}
- 1. Загрузка видео из Firebase хранения в VideoView
- 2. Показать видео в VideoView?
- 3. Видео Youtube в VideoView
- 4. Потоковое видео на VideoView
- 5. Невозможно воспроизвести видео в VideoView
- 6. Загрузка видео из галереи в VideoView с помощью кнопки
- 7. VideoView не играет видео
- 8. потокового видео с VideoView
- 9. Буферизация видео с VideoView
- 10. VideoView "Невозможно воспроизвести видео"
- 11. Открытие видео RTSP в VideoView
- 12. как повернуть видео в VideoView
- 13. видео из Url в VideoView
- 14. Бесшовная видео-петля с VideoView
- 15. VideoView не может воспроизводить видео
- 16. Android VideoView предотвращает изменение видео
- 17. VideoView для отображения погруженного видео
- 18. android- videoview не показывает видео
- 19. MediaPlayer/VideoView не воспроизводит видео?
- 20. Создание видео нагрузки быстрее VideoView
- 21. VideoView не воспроизводит видео (авария)
- 22. Android VideoView не воспроизводит видео
- 23. Воспроизведение двух видео в одном VideoView одновременно
- 24. Воспроизведение видео в VideoView в Android
- 25. Показать видео в галерее в VideoView
- 26. Ошибка отображения видео в VideoView в android
- 27. Загрузка Youtube видео в приложении без WebView
- 28. VideoView в ViewFlipper прозрачен, когда воспроизводится видео
- 29. Потоковое видео Youtube в android VideoView
- 30. Показать видео mp4 в Android VideoView
Единственная проблема, которую я получил в настоящее время является то, что видео не показывает вообще в представлении, что я имею в виду, что я хотел бы, чтобы показать (только первый кадр) и иметь элементы управления (воспроизведение/пауза, остановка, вперед и назад) прямо под ним ... – kivy
'MediaController' - это всплывающее окно - пользователю нужно нажать на свой« VideoView », чтобы он появился. Если вы хотите всегда видимые элементы управления, вам, вероятно, придется это сделать самостоятельно. См. Http://github.com/commonsguy/vidtry для проекта с использованием 'MediaPlayer' и' SurfaceView' с настраиваемой панелью «controller». Что касается первого кадра, кроме запуска воспроизведения, у вас нет способа заставить этот кадр отображать AFAIK. – CommonsWare