Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Компонент VideoView предназначен для воспроизведения видеоклипов.
Находится в разделе Images. Желательно использовать реальное устройство при тестировании примеров.
Android поддерживает файлы формата 3gp и mp4. Точную информацию по поддержке форматов воспроизведения мультимедийных файлов
Использовать класс VideoView очень просто. Он содержит поверхность (объект Surface), на которую выводится видео, а также инкапсулирует все операции по управлению проигрывателем. Размещаете на экране компонент и указываете путь к воспроизводимому файлу. Можно воспроизводить файлы с флеш-карточки, из ресурсов или с веб-сервера через интернет.
Данный элемент скрывает от разработчика инициализацию медиапроигрывателя, предоставляя удобный и простой API. Чтобы задать видео для воспроизведения, вызовите метод setVideoPath() или setVideoUri(). В качестве единственного параметра они принимают путь к локальному файлу, путь URI к источнику данных или адрес удалённого видеопотока.
Завершив инициализацию, вы получаете возможность управлять воспроизведением с помощью методов start(), stopPlayback(), pause() и seekTo(). VideoView также включает метод setKeepScreenOn() для предотвращения отключения подсветки экрана во время проигрывания.
Код для воспроизведения:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// установите свой путь к файлу на SD-карточке
String videoSource ="/sdcard/Movies/cat.3gp";
VideoView videoView = (VideoView) findViewById(R.id.videoView);
videoView.setVideoPath(videoSource);
videoView.setMediaController(new MediaController(this));
videoView.requestFocus(0);
videoView.start(); // начинаем воспроизведение автоматически
}
Метод setVideoPath() указывает на файл, который находится на SD-карточке. Не забудьте установить разрешение
<uses-permission android:name="android.permission.STORAGE" />
Метод videoView.setMediaController(new MediaController(this)); позволяет вывести кнопки паузы и воспроизведения. Кнопки появляются, если коснуться экрана. Можете не использовать данную возможность или отключать программно, используя значение null.
Метод requestFocus() необходим, чтобы компонент получил фокус и реагировал на касания пальцев.
Метод start() позволяет сразу начать воспроизведение файла. Если вам не нужно, то не добавляйте строку в код.
Если вам нужно воспроизвести файл с сервера, то нужно использовать метод setVideoURI:
String videoSource ="http://www.cats.com/cat-speak.3gp";
videoView.setVideoURI(Uri.parse(videoSource));
Не забываем добавить необходимое разрешение для работы через интернет:
<uses-permission android:name="android.permission.INTERNET" />
Ещё можно поместить файл в папку ресурсов res/raw. В этом случае также надо использовать URI:
String videoSource ="android.resource://ru.alexanderklimov.views/" + R.raw.cat;
videoView.setVideoURI(Uri.parse(videoSource));
// более универсальный вариант
// videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.cat));
Компонент может использовать методы интерфейса, которые используются классом MediaPlayer.
package ru.alexanderklimov.musicplayer;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// установите свой путь к файлу на SD-карточке
String videoSource = "/sdcard/Movies/cat.3gp";
//String videoSource = "rtsp://v5.cache1.c.youtube.com/CjYLENy73wIaLQklThqIVp_AsxMYESARFEIJbXYtZ29vZ2xlSARSBWluZGV4YIvJo6nmx9DvSww=/0/0/0/video.3gp";
VideoView videoView = (VideoView) findViewById(R.id.videoView);
// videoView.setVideoURI(Uri.parse(videoSource));
videoView.setVideoPath(videoSource);
videoView.setMediaController(new MediaController(this));
videoView.setOnCompletionListener(myVideoViewCompletionListener);
videoView.setOnPreparedListener(MyVideoViewPreparedListener);
videoView.setOnErrorListener(myVideoViewErrorListener);
videoView.requestFocus();
videoView.start();
}
MediaPlayer.OnCompletionListener myVideoViewCompletionListener
= new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
Toast.makeText(getApplicationContext(),
"End of Video",
Toast.LENGTH_LONG).show();
}
};
MediaPlayer.OnPreparedListener MyVideoViewPreparedListener
= new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
Toast.makeText(getApplicationContext(),
"Media file is loaded and ready to go",
Toast.LENGTH_LONG).show();
}
};
MediaPlayer.OnErrorListener myVideoViewErrorListener
= new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
Toast.makeText(getApplicationContext(),
"Error!!!",
Toast.LENGTH_LONG).show();
return true;
}
};
}
В комментариях дан альтернативный вариант загрузки файла из интернета. Раньше в Android 2.2 пример работал, сейчас я проверил на новых устройствах - видео не показывалось. Не знаю с чем связано.
Capture frames in VideoView using MediaMetadataRetriever