Advertisement
  1. Code
  2. Android SDK

Потоковое видео в приложениях для Android

Scroll to top
Read Time: 5 min

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

Платформа Android предоставляет библиотеки, которые вы можете использовать для потоковой передачи медиафайлов, таких как удалённые видеоролики, и для воспроизведения в ваших приложениях. В этом учебном пособии мы будем передавать видеофайл, отображая его с помощью компонента VideoView вместе с объектом MediaController, чтобы позволить пользователю управлять воспроизведением.

Мы также кратко рассмотрим процесс представления видео с использованием класса MediaPlayer. Если вы закончили серию по созданию музыкального проигрывателя для Android, вы можете использовать то, что узнаете в этом учебнике для дальнейшего его улучшения. Постарайтесь завершить этот урок, если уже разработали хотя бы несколько приложений для Android.

1. Создайте новое приложение

Шаг 1

Вы можете использовать код из этого урока для улучшения приложения, над которым вы работаете или создать новое приложение в Eclipse или Android Studio. Создайте новый проект Android, назовите его по своему выбору, настройте детали, задайте ему начальный основной класс Activity и макет.

Шаг 2

Сначала соберём декларацию проекта для потокового мультимедиа. Откройте файл манифеста своего проекта и переключитесь на редактирование XML в вашей среде IDE. Для потоковой передачи мультимедиа вам нужен доступ в Интернет, поэтому добавьте в элемент manifest следующее разрешение:

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

2. Добавление VideoView

Шаг 1

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

1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
    xmlns:tools="http://schemas.android.com/tools"
3
    android:layout_width="match_parent"
4
    android:layout_height="match_parent"
5
    android:paddingBottom="@dimen/activity_vertical_margin"
6
    android:paddingLeft="@dimen/activity_horizontal_margin"
7
    android:paddingRight="@dimen/activity_horizontal_margin"
8
    android:paddingTop="@dimen/activity_vertical_margin"
9
    android:background="#000000"
10
    tools:context=".MainActivity" >
11
12
    <VideoView
13
        android:id="@+id/myVideo"
14
        android:layout_width="fill_parent"
15
        android:layout_height="fill_parent"
16
        android:layout_centerInParent="true" />
17
        
18
</RelativeLayout>

При необходимости измените родительский макет, чтобы он соответствовал вашему приложению. Даём экземпляру VideoView атрибут id, чтобы мы могли обратиться к нему позже. Возможно, вам придется настроить другие свойства макета для собственной разработки.

Шаг 2

Теперь давайте вернём ссылку на экземпляр VideoView в коде. Откройте основной Activity класс приложения и добавьте следующие дополнительные ресурсы:

1
import android.net.Uri;
2
import android.widget.MediaController;
3
import android.widget.VideoView;

Ваш класс Activity уже должен содержать метод onCreate, в котором установлено представление содержимого:

1
@Override
2
protected void onCreate(Bundle savedInstanceState) {
3
  	super.onCreate(savedInstanceState);
4
		setContentView(R.layout.activity_main);
5
}

После строки setContentView давайте получим ссылку на  VideoView следующим образом, используя id, который мы установили в XML-макете:

1
VideoView vidView = (VideoView)findViewById(R.id.myVideo);

3. Потоковая передача видеофайла

Шаг 1

Теперь мы можем передать видеофайл в приложение. Подготовьте URI для конечной точки следующим образом:

1
String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";
2
Uri vidUri = Uri.parse(vidAddress);

Конечно, вам нужно будет использовать удалённый адрес для видеофайла, который вы хотите передать. Примером здесь является видеофайл общедоступного домена, размещенный в Internet Archive. Мы анализируем адресную строку как URI, чтобы могли передать её объекту VideoView:

1
vidView.setVideoURI(vidUri);

Теперь вы можете просто начать воспроизведение:

1
vidView.start();

Операционная система Android поддерживает ряд форматов видео и мультимедиа, причём каждое устройство часто поддерживает дополнительные форматы сверх того.

Как видно из Developer Guide, поддерживаемые форматы видеофайлов включают в себя 3GP, MP4, WEBM и MKV, в зависимости от формата и уровня платформы, установленных пользователем.

Форматы аудиофайлов, которые вы можете ожидать, включают встроенную поддержку MP3, MID, OGG и WAV. Вы можете транслировать медиафайлы на Android через RTSP, HTTP и HTTPS (с Android 3.1).

4. Добавьте управление воспроизведением

Шаг 1

Мы реализовали воспроизведение видео, но пользователь привык его контролировать. И платформа Android предоставляет ресурсы для этого, используя привычное взаимодействие через класс MediaController.

В методе onCreate класса Activity перед строкой, в которой вы вызываете start в VideoView, создайте экземпляр класса:

1
MediaController vidControl = new MediaController(this);

Затем установите его для использования экземпляра VideoView в качестве привязки:

1
vidControl.setAnchorView(vidView);

Наконец, установите его в качестве медиа-контроллера для объекта VideoView:

1
vidView.setMediaController(vidControl);

Если сейчас запустить приложение, пользователь будет иметь возможность управлять воспроизведением потокового видео, включая кнопки быстрой перемотки вперёд и назад, кнопку воспроизведения/паузы и панель управления поиском.

Регулятор панели поиска сопровождается длиной файла мультимедиа справа и текущей позицией воспроизведения слева. Помимо возможности касания вдоль панели поиска, чтобы перейти к позиции в файле, статус потоковой передачи отображается с использованием того же типа отображения, к которому пользователь привык на сайтах и приложениях, таких как YouTube.

Как вы увидите при запуске приложения, вид по умолчанию для элементов управления исчезает через несколько секунд, вновь появляясь, когда пользователь касается экрана. Вы можете настроить поведение объекта MediaController различными способами. Смотрите series on creating a music player app for Android в качестве примера, как это сделать. Вы также можете улучшить звук мультимедиа через устройства воспроизведения, чтобы настроить поведение вашего приложения.

5. Использование MediaPlayer

Шаг 1

Прежде чем мы закончим, давайте рассмотрим альтернативный подход для потоковой передачи видео с помощью класса MediaPlayer, поскольку мы использовали его в серии series on creating a music player. Вы можете транслировать мультимедиа, включая видео, в объект MediaPlayer, используя вид поверхности. Например, вы можете использовать следующий макет:

1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
    xmlns:tools="http://schemas.android.com/tools"
3
    android:layout_width="match_parent"
4
    android:layout_height="match_parent"
5
    android:background="#000000"
6
    android:paddingBottom="@dimen/activity_vertical_margin"
7
    android:paddingLeft="@dimen/activity_horizontal_margin"
8
    android:paddingRight="@dimen/activity_horizontal_margin"
9
    android:paddingTop="@dimen/activity_vertical_margin"
10
    tools:context=".MainActivity" >
11
12
    <SurfaceView
13
        android:id="@+id/surfView"
14
        android:layout_width="fill_parent"
15
        android:layout_height="fill_parent" />
16
17
</RelativeLayout>

Мы будем ссылаться на SurfaceView в реализации класса Activity.

Шаг 2

В своём классе Activity добавьте следующие интерфейсы:

1
public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener

Ваша IDE должна предложить вам добавить эти нереализованные методы:

1
@Override
2
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
3
	// TODO Auto-generated method stub

4
}
5
6
@Override
7
public void surfaceCreated(SurfaceHolder arg0) {
8
//setup

9
}
10
11
@Override
12
public void surfaceDestroyed(SurfaceHolder arg0) {
13
	// TODO Auto-generated method stub

14
}
15
16
@Override
17
public void onPrepared(MediaPlayer mp) {
18
//start playback

19
}

Мы добавим методы surfaceCreated и onPrepared.

Шаг 3

Для реализации воспроизведения добавьте в класс следующие переменные:

1
private MediaPlayer mediaPlayer;
2
private SurfaceHolder vidHolder;
3
private SurfaceView vidSurface;
4
String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";

В методе onCreate в Activity вы можете начать создавать эти переменные, используя объект SurfaceView, добавленный в макет:

1
vidSurface = (SurfaceView) findViewById(R.id.surfView);
2
vidHolder = vidSurface.getHolder();
3
vidHolder.addCallback(this);

Шаг 4

В методе surfaceCreated настройте ресурсы воспроизведения мультимедиа:

1
try {
2
	mediaPlayer = new MediaPlayer();
3
	mediaPlayer.setDisplay(vidHolder);
4
	mediaPlayer.setDataSource(vidAddress);
5
	mediaPlayer.prepare();
6
	mediaPlayer.setOnPreparedListener(this);
7
	mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
8
} 
9
catch(Exception e){
10
	e.printStackTrace();
11
}

Наконец, в методе onPrepared начните воспроизведение:

1
mediaPlayer.start();

Теперь ваше видео должно воспроизводиться в экземпляре MediaPlayer при запуске приложения.

Заключение

В этом учебном пособии мы изложили основы потокового видео на Android с использованием классов VideoView и MediaPlayer. Вы можете добавить много улучшений в код, который мы реализовали, например, путём создания видео или поддержки потокового мультимедиа в созданном нами приложении музыкального проигрывателя. Вы также можете проверить ресурсы, связанные с Android, такие как YouTube Android Player API.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.