2016-10-13 14 views
5

ứng dụng Android của tôi phát trực tuyến video theo số VideoView. Khi phát video từ một tệp, nó hoạt động tốt hoặc thậm chí phát trực tiếp (một m3u8); Nó luôn phát trực tiếp từ cùng một nguồn và khi tôi sử dụng trình phát/trình duyệt bên ngoài, nó cũng tương tự như luồng (vì vậy tôi không nghĩ đây là vấn đề với nguồn, đây là biến thể của tệp như sau: https://publish.dvlabs.com/democracynow/360/dn2016-0810.mp4VideoView Tải xuống luồng không đủ bộ đệm

logs Android Màn hình này ngay trước khi vụ tai nạn:

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) 

và sau đó tôi nhận được những bản ghi khi nó bị treo:

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 

Để được chính xác hơn về câu hỏi của tôi:

012.351.
  1. Tôi muốn biết lỗi này là gì, E/MediaPlayer: Error (1,-1004) là (vì tôi chưa tìm thấy bất kỳ thông tin nào trên web về nó).
  2. Nếu nó là những gì tôi nghi ngờ, về cơ bản là kết thúc của lỗi tập tin/dòng, sau đó tôi hy vọng sẽ nhận được một số trợ giúp đệm hoặc tải video theo cách như vậy để tránh điều này?

Tôi đã xem câu hỏi này, Android Streaming with MediaPlayer: Error(1, -1004) and 3GPP video, nhưng câu trả lời không giúp được gì nhiều.

Tôi đã tìm thấy một hàm, MediaPlayer.prepareAsync(), tại đây https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync(), tính năng này được tự động gọi khi một video VideoView mở, nhưng điều này dường như không hoạt động.

Sửa

Vì vậy, các giải pháp đưa tôi đến Google ExoPlayer, đó là khá dễ dàng để trao đổi tại cho VideoView của tôi, và nó hoạt động như một nét duyên dáng.

  1. Thêm ExoPlayer như phụ thuộc Đổi dạng hiển thị
  2. trong cách bố trí để SimpleExoPlayerView
  3. Initialize SimpleExoPlayer trong Hoạt động
  4. Initialize MediaSource và gắn vào máy nghe nhạc
  5. Hãy nhớ release() khi không còn cần thiết.

Và với điều đó, phát trực tuyến hoạt động liền mạch.

+1

Sử dụng https://github.com/google/ExoPlayer – Qamar

+0

Có ... đó là giải pháp – Nevermore

Trả lời

1

Lớp MediaPlayer Android không cung cấp quyền truy cập vào cài đặt cấp thấp hơn như kích thước bộ đệm.

Form log -1004 có nghĩa là: public static final int MEDIA_ERROR_IO

Đối với tôi mã này là công việc tốt:

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

Nó dường như đã được một cái gì đó liên quan đến nguồn của con suối, bởi vì một số nguồn tin thậm chí chơi trên các thiết bị, nhưng một trong những chúng tôi cần thiết, không bao giờ chơi.

Nếu bạn có thể thấy sau đó bạn biết một số vấn đề với luồng của mình bằng nhật ký.

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

ngoại lệ đó được ném bởi FixedLengthInputStream khi số lượng dự kiến ​​của byte (thường được thiết lập trong tiêu đề nội dung có độ dài của phản ứng) là lớn hơn so với số liệu thực tế trong các phản ứng. Kiểm tra xem tiêu đề nội dung có độ dài chính xác không. (Nếu bạn đang cung cấp giá trị của riêng bạn cho độ dài nội dung, chắc chắn rằng nó là đúng.)

Để cụ thể hơn xin vui lòng xem bài này unexpected end of stream error

khác một điều này cũng giúp bạn, Vui lòng kiểm tra link này như thế nào để tạo bộ đệm thời gian dài cho MediaPlayer

+0

Vì vậy, liên kết cuối cùng đã đưa tôi đến ExoPlayer ... đó là những gì tôi cần – Nevermore

0

VideoView trên Android không phải là tốt nhất, nếu bạn sử dụng VLC, bạn sẽ nhận được trải nghiệm đệm video mượt mà hơn nhiều.

Dưới đây là hướng dẫn về cách biên dịch VLC từ nguồn dành cho Android: https://wiki.videolan.org/AndroidCompile/

0

Sử dụng VideoView trong streaming video có thể gây ra đôi khi vấn đề. Tôi cũng phải đối mặt với rất nhiều vấn đề.

Sử dụng thư viện JieCaoVideoPlayer để phát trực tuyến Video. Nó cho phép nhiều tùy chọn hơn.

https://github.com/lipangit/JieCaoVideoPlayer

Chỉ cần nhập nó

compile 'fm.jiecao:jiecaovideoplayer:5.3' 

Thêm trong cách bố trí của bạn như xem bình thường

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

Set URL mà bạn muốn chơi

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

Tôi thấy hình thu nhỏ rất kỳ lạ của video trong ganyub của JieCaoVideoPlayer ... –

+0

Có, Đó là một điều kỳ lạ nhưng chúng tôi chỉ muốn mã nên bỏ qua nó. Thư viện rất tốt để phát video –

Các vấn đề liên quan