Робота з відео

У стандартному наборі віджетів Android визначений клас VideoView, який дозволяє відтворювати відео.

Які типи відеофайлів можна використовувати?

Android підтримує більшість поширених типів відеофайлів, зокрема:

  • 3GPP (.3gp)
  • WebM (.webm)
  • Matroska (.mkv)
  • MPEG-4 (.mp4)

VideoView може працювати як із відеороликами, розміщеними на мобільному пристрої, так і з відеоматеріалами із мережі.

Використання локального відео

У даному прикладі використовується відеоролик, розміщений локально. Для цього додаємо відеофайл до проєкту.

Додавання відеофайлу до проєкту

Зазвичай відеоматеріали розміщують у папці res/raw. За замовчуванням проєкт не містить такої папки, тому її потрібно створити.

  1. Натисніть на папку res правою кнопкою миші.
  2. У контекстному меню виберіть New -> Android Resource Directory.

Потім у вікні, що з'явилося, як тип папки вкажемо raw (що також буде використовуватися як назва папки):

Після додавання папки raw скопіюємо в неї який-небудь відеофайл:

Тепер визначимо функціонал для його відтворення. Для цього у файлі activity_main.xml вкажемо такий код:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
        android:id="@+id/playButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Play"
        android:onClick="play"
        app:layout_constraintBottom_toTopOf="@id/videoPlayer"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/pauseButton"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/pauseButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Pause"
        android:onClick="pause"
        app:layout_constraintBottom_toTopOf="@id/videoPlayer"
        app:layout_constraintLeft_toRightOf="@id/playButton"
        app:layout_constraintRight_toLeftOf="@id/stopButton"
        app:layout_constraintTop_toTopOf="parent"/>
    <Button
        android:id="@+id/stopButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Stop"
        android:onClick="stop"
        app:layout_constraintBottom_toTopOf="@id/videoPlayer"
        app:layout_constraintLeft_toRightOf="@id/pauseButton"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <VideoView android:id="@+id/videoPlayer"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/playButton"/>
 
</androidx.constraintlayout.widget.ConstraintLayout>

Для управління відтворенням відео тут визначено три кнопки: для запуску відео, для паузи та для його зупинки.

І також змінимо код MainActivity:

package com.example.mediaapp;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.VideoView;
 
public class MainActivity extends AppCompatActivity {
 
    VideoView videoPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        videoPlayer = findViewById(R.id.videoPlayer);
        Uri myVideoUri= Uri.parse( "android.resource://" + getPackageName() + "/" + R.raw.cats);
        videoPlayer.setVideoURI(myVideoUri);
    }
 
    public void play(View view){
        videoPlayer.start();
    }
    public void pause(View view){
        videoPlayer.pause();
    }
    public void stop(View view){
        videoPlayer.stopPlayback();
        videoPlayer.resume();
    }
}

По-перше, щоб керувати потоком відтворення, нам потрібно отримати об'єкт VideoView:
videoPlayer = findViewById(R.id.videoPlayer);

Щоб вказати джерело відтворення, необхідний об'єкт Uri. У цьому випадку за допомогою виразу
Uri myVideoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.cats);
отримуємо адресу відеоролика всередині пакета застосунку.

Рядок URI має кілька частин: спочатку йде Uri-схема (http:// або, як тут, android.resource://), потім назва пакета, отримана через метод getPackageName(), і далі безпосередньо назва ресурсу відео з папки res/raw, що збігається з назвою файлу.

Потім цей Uri встановлюється у videoPlayer:
videoPlayer.setVideoURI(myVideoUri);

Щоб керувати відеопотоком, обробники натискання кнопок викликають відповідну дію:

public void play(View view){
    videoPlayer.start();
}
public void pause(View view){
    videoPlayer.pause();
}
public void stop(View view){
    videoPlayer.stopPlayback();
    videoPlayer.resume();
}
  • Метод videoPlayer.start() починає або продовжує відтворення.
  • Метод videoPlayer.pause() призупиняє відео.
  • Метод videoPlayer.stopPlayback() повністю зупиняє відео.
  • Метод videoPlayer.resume() дозволяє знову розпочати відтворення відео з початку після його повної зупинки.

MediaController

За допомогою класу MediaController ми можемо додати до VideoView додатково елементи керування. Для цього змінимо код MainActivity:

package com.example.mediaapp;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.VideoView;
import android.widget.MediaController;
 
public class MainActivity extends AppCompatActivity {
 
    VideoView videoPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        videoPlayer = findViewById(R.id.videoPlayer);
        Uri myVideoUri= Uri.parse( "android.resource://" + getPackageName() + "/" + R.raw.cats);
        videoPlayer.setVideoURI(myVideoUri);
        MediaController mediaController = new MediaController(this);
        videoPlayer.setMediaController(mediaController);
        mediaController.setMediaPlayer(videoPlayer);
    }
 
    public void play(View view){
        videoPlayer.start();
    }
    public void pause(View view){
        videoPlayer.pause();
    }
    public void stop(View view){
        videoPlayer.stopPlayback();
        videoPlayer.resume();
    }
}

І якщо ми запустимо додатки, то під час торкання VideoView внизу з'являться інструменти для управління відео. У прицнипі тепер і кнопки, які ми створили раніше, не потрібні:

Відтворення файлу з інтернету

VideoView підтримує відтворення файлу з інтернету. Але щоб це стало можливим, необхідно у файлі AndroidManifest.xml встановити дозвіл android.permission.INTERNET, оскільки ми отримуємо дані з інтернету:

<uses-permission android:name="android.permission.INTERNET" />

Далі змінимо клас MainActivity:

package com.example.mediaapp;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.View;
import android.widget.VideoView;
 
public class MainActivity extends AppCompatActivity {
 
    VideoView videoPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoPlayer = findViewById(R.id.videoPlayer);
        videoPlayer.setVideoPath("http://techslides.com/demos/sample-videos/small.mp4");
    }
 
    public void play(View view){
        videoPlayer.start();
    }
    public void pause(View view){
        videoPlayer.pause();
    }
    public void stop(View view){
        videoPlayer.stopPlayback();
        videoPlayer.resume();
    }
}

Тут нам треба в метод videoPlayer.setVideoPath() передати інтернет-адресу відтворюваного файлу.