Статьи

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

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

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

Если вы хотите получить готовое решение, воспользуйтесь YoVideo , шаблоном приложения для Android для создания прекрасного мобильного видеоплеера для смартфона Android.

Пользователи могут просматривать видео, следить и делиться с друзьями на Facebook. Использование этого шаблона приложения позволит вам сэкономить деньги и время при создании приложения для обмена видео.

YoVideo на рынке Envato
YoVideo на рынке Envato

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<RelativeLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    xmlns:tools=»http://schemas.android.com/tools»
    android:layout_width=»match_parent»
    android:layout_height=»match_parent»
    android:paddingBottom=»@dimen/activity_vertical_margin»
    android:paddingLeft=»@dimen/activity_horizontal_margin»
    android:paddingRight=»@dimen/activity_horizontal_margin»
    android:paddingTop=»@dimen/activity_vertical_margin»
    android:background=»#000000″
    tools:context=».MainActivity» >
 
    <VideoView
        android:id=»@+id/myVideo»
        android:layout_width=»fill_parent»
        android:layout_height=»fill_parent»
        android:layout_centerInParent=»true» />
         
</RelativeLayout>

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

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

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

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

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

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

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

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

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

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

1
vidView.setVideoURI(vidUri);

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

1
vidView.start();

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

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

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

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

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

1
MediaController vidControl = new MediaController(this);

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

1
vidControl.setAnchorView(vidView);

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

1
vidView.setMediaController(vidControl);

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<RelativeLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    xmlns:tools=»http://schemas.android.com/tools»
    android:layout_width=»match_parent»
    android:layout_height=»match_parent»
    android:background=»#000000″
    android:paddingBottom=»@dimen/activity_vertical_margin»
    android:paddingLeft=»@dimen/activity_horizontal_margin»
    android:paddingRight=»@dimen/activity_horizontal_margin»
    android:paddingTop=»@dimen/activity_vertical_margin»
    tools:context=».MainActivity» >
 
    <SurfaceView
        android:id=»@+id/surfView»
        android:layout_width=»fill_parent»
        android:layout_height=»fill_parent» />
 
</RelativeLayout>

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
}
 
@Override
public void surfaceCreated(SurfaceHolder arg0) {
//setup
}
 
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
}
 
@Override
public void onPrepared(MediaPlayer mp) {
//start playback
}

Мы добавим на поверхность surfaceCreated и onPrepared методы.

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
try {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setDisplay(vidHolder);
    mediaPlayer.setDataSource(vidAddress);
    mediaPlayer.prepare();
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
catch(Exception e){
    e.printStackTrace();
}

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

1
mediaPlayer.start();

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

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