Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

VideoView

Компонент 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

Компонент может использовать методы интерфейса, которые используются классом 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

Реклама