Потоковое видео в приложениях для Android
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.