Подтвердить что ты не робот

Android HLS Streaming - разные версии Android Загрузите другое местоположение в потоке

Я понимаю, что есть некоторые проблемы с точки зрения уровня поддержки HLS в Android. Я пытаюсь написать небольшую демонстрацию видеопроигрывателя (чтобы работать как можно больше устройств); предпочтительно без использования сторонней библиотеки; который может передавать видео HLS.

ПРИМЕЧАНИЕ. В настоящее время я тестирую JellyBean 4.2.2, но имею доступ к другим версиям

Мне удалось использовать класс MediaPlayer, чтобы мое приложение могло начать воспроизведение потока (например, тестовое видео Apple BipBopAll), но похоже загрузите неправильную часть потока, поскольку видео, кажется, начинается через 29 минут (и так заканчивается через приблизительно тридцать секунд).

Код, который я использовал, довольно простой:

private void playTrack()
{   
    player = new MediaPlayer();

    try 
    {                   
        player.setDisplay(holder);
        player.setDataSource("http://devimages.apple.com/iphone/samples/bipbop
                              /bipbopall.m3u8");
        player.prepare();

    } 
    catch (...) 
    {
    }
    player.start();
}

Обновление: Я тестировал один и тот же код на ICS 4.0.4, и он работает правильно. Тестирование в версии 3.0.1 загружает поток через 15 минут, а затем выполняется корректно.

Что можно сделать, чтобы поток начинался с самого начала и правильно воспроизводился на нескольких версиях Android?

Или, есть ли лучшая реализация, которую я должен использовать?

4b9b3361

Ответ 1

Следуя дальнейшему исследованию, я нашел следующую информацию, которая, надеюсь, поможет другим людям получить потоковое видео HLS на Android.

Кодировка  - Кодирование видео и настройка сегментации могут иметь большое влияние на версии Android, поддерживаемые видео. Я закончил создание видео с помощью HandBrake со следующими настройками:

  • Файл MP4
  • H.264; Базовый профиль; Уровень 3
  • AAC Audio; 44.1k; 128bit (Примечание). Я обнаружил, что JellyBean был намного более придирчивым в отношении звука, чем ICS/Honeycomb. Некоторые звуковые битрейты создавали видеоролики, которые Jellybean вообще не воспроизводит. В общем, моно и низкий звук с битрейтом лучше работать на железе).

Сегментация. Используя Apple MediaFileSegmenter, я обнаружил, что добавление флагов "-no-floating-point-duration-duration" и "-z none" позволило мне создать видео, работающее в Android 3.0- > 4.2

Gingerbread. Мне не удалось заставить Android 2.3 работать с HLS из коробки, но я обнаружил, что использование библиотеки Vitamio работает очень хорошо (см. этот вопрос для дальнейшей информации)

Ответ 2

Некоторые версии Android, похоже, интерпретируют HLS на http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 как живая HLS, а не VOD HLS, и, таким образом, медиаплеер начинает приближаться к "живая" точка, близкая к контенту контента, около 29 минут в контент.

И вот почему: до 4.3 последняя строка в файле списка воспроизведения HLS не анализировалась, если она не закончилась в '\n'.

См. историю изменений в этом файле: http://androidxref.com/4.3_r2.1/history/frameworks/av/media/libstagefright/httplive/M3UParser.cpp, 12/31/12, есть изменения, которые устранили проблему. Вопрос пропал 4.4.

Итак, одним из способов решения проблемы в старых версиях является добавление новой строки после последней строки списка воспроизведения на сервере или реализация прокси-сервера HTTP в вашем приложении, которое эффективно добавляет эту новую строку, что может и не быть тривиальным..

Ответ 4

   <?xml version="1.0" encoding="utf-8" ?> 
    - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
      <VideoView android:id="@+id/surface_view" android:layout_width="fill_parent" android:layout_height="300dp" android:layout_gravity="center" /> 
      <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/surface_view" android:layout_marginRight="62dp" android:layout_marginTop="16dp" android:text="Stop" /> 
      <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_alignParentLeft="true" android:layout_marginLeft="34dp" android:text="Start" /> 
      </RelativeLayout>

*******************************************************************
     startB.setOnClickListener(new View.OnClickListener() {
@Override
            public void onClick(View v) {
                 mVideoView = (VideoView) findViewById(R.id.surface_view);
                   mVideoView.setVideoURI(Uri.parse("http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"));                
                   mVideoView.setMediaController(new     MediaController(MainActivity.this));
                   mVideoView.requestFocus();              
                   mVideoView.postInvalidateDelayed(100);  
                  new Thread(new Runnable() {
                      public void run() {
                          mVideoView.start();

                      }
                  }).start();
            }
        });