2016-10-13 2 views
5

мое приложение для Android потоки видео онлайн в VideoView. При воспроизведении видео из файла он отлично работает или даже транслируется в реальном времени (m3u8); Он всегда передается из одного источника, и когда я использую внешний проигрыватель/браузер, он также отлично передает потоки (поэтому я не думаю, что это проблема с источником, что является разновидностью такого файла: https://publish.dvlabs.com/democracynow/360/dn2016-0810.mp4VideoView Поток загружается не достаточно буферизировать

Андроида Monitor журналы это как раз перед крушением:

10-13 12:02:56.204 32460-32748/com.workingagenda.democracydroid D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1) 
10-13 12:02:56.205 32460-32472/com.workingagenda.democracydroid D/MediaHTTPConnection: proxy null port 0 
10-13 12:02:57.904 32460-32460/com.workingagenda.democracydroid D/MediaPlayer: getMetadata 
10-13 12:02:58.438 32460-377/com.workingagenda.democracydroid W/MediaPlayer: info/warning (3, 0) 

, а затем я получаю эти журналы, когда он выходит из строя:

10-13 12:05:33.812 32460-32472/com.workingagenda.democracydroid W/MediaHTTPConnection: readAt 26869519/241 => java.net.ProtocolException: unexpected end of stream 
10-13 12:08:32.480 32460-3546/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004) 
10-13 12:08:32.480 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004) 
10-13 12:08:32.481 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004 

                     [ 10-13 12:08:32.512 5066: 453 E/   ] 
                     Destroy C2D instance 

                     [ 10-13 12:08:32.512 5066: 453 E/   ] 
                     Destroy C2D instance 
10-13 12:08:32.635 32460-32472/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004) 
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004) 
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004 

Чтобы быть более точным мой вопрос:

  1. Я хотел бы знать, что это за ошибка, E/MediaPlayer: Error (1,-1004) есть (так как я не нашел никакой информации в Интернете об этом).
  2. Если это то, что я подозреваю, в основном как конец ошибки файла/потока, то я надеюсь получить некоторую помощь буферизации или иным образом загрузить видео таким образом, чтобы этого избежать?

Я видел этот вопрос, Android Streaming with MediaPlayer: Error(1, -1004) and 3GPP video, но ответы не очень помогают.

Я нашел функцию, MediaPlayer.prepareAsync(), здесь https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync(), это автоматически вызывается, когда VideoView открывает видеоролик, но это, похоже, не работает.

Редактировать

Таким образом, решение привело меня к Google, ExoPlayer, который был довольно легко поменять в моей VideoView, и он работает как шарм.

  1. Добавить ExoPlayer в зависимости
  2. Изменить вид в макете, чтобы SimpleExoPlayerView
  3. Initialize SimpleExoPlayer в деятельности
  4. Initialize MediaSource и прикрепить к игроку
  5. Помните release(), когда больше не нужны.

И с этим потоковые работы беспрепятственно.

+1

Использование https://github.com/google/ExoPlayer – Qamar

+0

Да ... это решение – Nevermore

ответ

1

Класс Android MediaPlayer не обеспечивает доступ к настройкам более низкого уровня, таким как размер буфера.

журнал Форма -1004 означает: public static final int MEDIA_ERROR_IO

Для меня этот код отлично работает:

try{ 
    MediaController mediaController = new MediaController(this); 

    Uri video = Uri.parse(url); 

    mediaController.setAnchorView(videoView); 
    videoView.requestFocus(); 
    videoView.setMediaController(mediaController); 
    videoView.setVideoURI(video); 

    videoView.setOnPreparedListener(new OnPreparedListener() 
    { 

     @Override 
     public void onPrepared(MediaPlayer arg0) 
     { 
      videoView.start(); 
     } 
    }); 
}catch (Exception e) { 
    e.printStackTrace(); 
} 

Казалось, что было что-то отношение к источнику потока, поскольку некоторые источники в конечном итоге играл на устройство, но тот, который нам нужен, никогда не играл.

Если вы видите, то знаете, что проблема с вашим потоком связана с журналом.

MediaHTTPConnection: readAt 26869519/241 => java.net.ProtocolException: unexpected end of stream 

Это исключение выбрасывается FixedLengthInputStream, когда ожидаемое число байтов (обычно устанавливается в Content-Length заголовок ответа) больше, чем фактические данные в ответе. Проверьте правильность заголовка содержимого. (Если вы поставлять собственное значение длины содержимого, убедитесь, что это правильно.)

Более подробно смотрите этот пост unexpected end of stream error

Другое этот также поможет вам, пожалуйста, проверьте этот link, что как создать длинный буфер времени для MediaPlayer

+0

Так что последняя ссылка привела меня в ExoPlayer ... вот что мне нужно – Nevermore

0

VideoView на Android не самый лучший, если вы используете VLC, вы получите гораздо более плавное воспроизведение буферизации видео.

Ниже приведены инструкции о том, как скомпилировать VLC из исходных кодов для Android: https://wiki.videolan.org/AndroidCompile/

0

Использование VideoView в потоковом видео может вызвать где-то проблему. Я также столкнулся с таким количеством вопросов.

Использование библиотеки JieCaoVideoPlayer для потока Video. Это позволяет использовать больше опций.

https://github.com/lipangit/JieCaoVideoPlayer

Просто импортировать его

compile 'fm.jiecao:jiecaovideoplayer:5.3' 

Добавить в макете, как обычный вид

<fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard 
    android:id="@+id/videoplayer" 
    android:layout_width="match_parent" 
    android:layout_height="200dp"/> 

набор URL, который вы хотите играть

JCVideoPlayerStandard jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.videoplayer); 
jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4" 
         , JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, "Video"); 
jcVideoPlayerStandard.thumbImageView.setImage("http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640"); 
+0

я вижу очень странные эскизы видео в GitHub JieCaoVideoPlayer в ... –

+0

Да, это странно, но мы просто хотим, чтобы код просто игнорировал его. Библиотека хороша для потокового видео –

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