Работа с мультимедиа

Работа с видео

Последнее обновление: 17.10.2021

Для работы с видеоматериалами в стандартном наборе виджетов Android определен класс VideoView, который позволяет воспроизводить видео.

Какие типы видеофайлов можно использовать? Android поддерживает большинство распространенных типов видеофайлов, в частности, 3GPP (.3gp), WebM (.webm), Matroska (.mkv), MPEG-4 (.mp4).

VideoView может работать как с роликами, размещенными на мобильном устройстве, так и с видеоматериалами из сети. В данном случае используем видеоролик, размещенный локально. Для этого добавим в проект какой-нибудь видеоролик. Обычно видеоматериалы помещают в проекте в папку res/raw. По умолчанию проект не содержит подобной папки, поэтому добавим в каталог res подпапку raw. Для этого нажмем на папку res правой кнопкой мыши и в появившемся меню выберем New -> Android Resource Directory:

Добавление папки raw в проект Android Studio

Затем в появившемся окне в качестве типа папки укажем raw (что также будет использоваться в качестве названия папки):

Создание папки raw в проект Android Studio

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

Добавление видеофайла в Android Studio

Теперь определим функционал для его воспроизведения. Для этого в файле 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() позволяет снова начать воспроизведение видео с начала после его полной остановки.

При запуске приложения мы сможем с помощью кнопок управляь воспроизведением:

Воспроизведение видео в Android и VideoView

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 и MediaController в Android

Воспроизведение файла из интернета

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() передать интернет-адрес воспроизводимого файла.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850