2013-05-29 2 views
18

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

ПРИМЕЧАНИЯ: Я в настоящее время тестирование на 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(); 
} 

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

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

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

ответ

0
<?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(); 
      } 
     }); 
+0

надеюсь, что он может решить проблему ur.it работает отлично в моей стороне. – PankajSharma

+0

Спасибо за ответ @Pankaj. К сожалению, я все еще вижу ту же проблему. Ваш код работает для меня на ICS 4.0.4, но на Jellybean 4.2 поток загружается через 29 минут 30 секунд. – HaemEternal

14

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

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

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

Сегментация - Используя Apple, MediaFileSegmenter, я обнаружил, добавив «-no-плавающей точкой-длительность» и «-z NONE» флаги позволило мне создать видео, которое работало по Android 3.0-> 4.2

Gingerbread - Мне не удалось получить Android 2.3 для работы с HLS из коробки, но я считаю, что с помощью библиотеки Vitamio работала довольно хорошо (см this question для получения дополнительной информации)

+1

Вы считаете необходимым перекодировать MP4 с ручным тормозом перед трансмуксированием и сегментированием с помощью mediafilesegmenter? Я пробовал 360p MP4 с youtube (h.264 с aac) и обрабатывался с помощью mediafilesegmenter; получившаяся HLS отлично работает на iPad, но зависает через 1 секунду на Android 4.0.3. – Fixee

+1

@Fixee Да, я обнаружил, что настройка MP4 была, вероятно, более важной, чем настройки, используемые для сегментации. Как упоминалось выше, я обнаружил, что настройки звука скорее всего испортили, чем видео. В качестве теста попробуйте добавить флаг -A в mediafilesegmenter. Это даст вам видео без звука. Если это правильно, вы узнаете, что это настройка звука, которую вам нужно настроить. – HaemEternal

+1

Использование -A устраняет все проблемы с отображением видео, которое у меня было. Спасибо .. время, чтобы пойти гадать вокруг с настройками звука сейчас! :) – Fixee

3

Некоторые версии Android, кажется, интерпретировать HLS в http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 живой ЗОЖ, а не 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 в вашем приложении, которое эффективно добавляет эту новую строку, что может и не быть тривиальным. ..

+0

Я не уверен, почему это означало бы, что Honeycomb начинается через 15 минут? – HaemEternal

+0

Не знаю много об Android 3.0 w.r.t. HLS. Это было просто добавлено, и, возможно, было еще больше ошибок, чем сегодня. – Dino

Смежные вопросы