2011-08-10 35 views
5

Tôi có một ứng dụng với VideoView sẽ tiếp tục lặp lại cùng một video cho đến khi người dùng thực hiện điều gì đó với thiết bị (màn hình cảm ứng, v.v.) Hiện tại tôi đang sử dụng OnCompletionListener() để khởi động lại video một khi nó kết thúc. Điều này hoạt động đúng trên mọi thiết bị tôi đã thử nghiệm, ngoại trừ Samsung Replenish.VideoView looping video Replenish

Đây là mã của tôi:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      mVideoView.setVideoPath(file.getAbsolutePath()); 
      mVideoView.start(); 
     } 
    }); 

gì xảy ra trên Replenish là video chơi tất cả các cách thức thông qua một lần nhưng sau đó không bao giờ bắt đầu một lần nữa và màn hình đi tất cả màu đen (Nhưng đèn nền vẫn bật). Trên mọi thiết bị khác tôi đã thử nghiệm cùng với mã chính xác này, nó đã làm việc để lặp lại video. Có ai biết về bất cứ điều gì cụ thể về các Replenish có thể gây ra lỗi này? Tôi nghĩ có thể trì hoãn các cuộc gọi đến setVideoPath(), và bắt đầu() bằng 200-300ms có thể giúp nó, nhưng điều đó không ảnh hưởng gì. Tôi thực sự thua lỗ ở đây.

tôi nhìn thấy những tin nhắn trong Log của tôi:

LỖI/QCvdec (87): OMX Flush đưa ra khi vdec không được khởi tạo được nêu ra.

LỖI/QCvdec (87): OMXCORE-SM: Nhận được lệnh DISABLE (2)

LỖI/QCvdec (87): OMX Flush đưa ra khi vdec không được khởi tạo được nêu ra.

LỖI/QCvdec (87): OMXCORE-SM: lệnh Nhận được ENABLE (3)

Nhưng những bản ghi đang xảy ra cả khi video bắt đầu (lần đầu tiên nó đóng) và khi nó không thành công để bắt đầu lần nữa. vì vậy tôi không chắc chắn nếu họ có liên quan đến vấn đề của tôi

Edit:

Tôi chỉ cố gắng thiết lập mVideoView null, và sau đó nhận được một tài liệu tham khảo mới cho nó với findViewById() ngay trước khi setVideoPath(). Tôi biết điều này sẽ làm phức tạp cách thức OnCompletionListener được thiết lập. Nhưng bất kể nó vẫn không hoạt động, vẫn là màn hình tối.

Chỉnh sửa 2:

Tôi đã bắt đầu nhận thấy rằng đôi khi video thậm chí không bắt đầu lần đầu tiên. Tôi đang sử dụng hai dòng giống nhau này để bắt đầu nó lên lần đầu tiên:

 mVideoView.setVideoPath(file.getAbsolutePath()); 
     mVideoView.start(); 

Có vẻ như bắt đầu nhiều hơn, nhưng không hoàn toàn 100% khi lần đầu tiên nó được phát.

Chỉnh sửa 3: Đây là cách tôi thiết lập nó ngay bây giờ. Tôi tự đặt OnPreparedListener để bắt đầu video cho tôi. Vì vậy, tôi đã thêm này để onCreate của tôi()

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer arg0) { 
       mVideoView.start(); 
      } 
     }); 

Sau đó, khi tôi đã sẵn sàng để khởi động lại các đoạn video tôi chỉ cần gọi chỉ phương pháp setVideoPath(), Như thế này:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mp) { 
     mVideoView.setVideoPath(file.getAbsolutePath()); 

    } 
}); 

này có vẻ là làm lừa. Tôi cho phép nó chạy trong một thời gian để tìm ra chắc chắn mặc dù.

Sửa 4:

@MByD Trong mã cho VideoView setVideoPath() là một wrapper cho setVideoUri(). setVideoURI() đang thiết lập mStartWhenPrepared = false; OnPreparedListener mặc định sẽ kiểm tra công tắc này để quyết định xem có bắt đầu phát lại hay không. Đó là lý do tại sao nó không bắt đầu với người nghe mặc định. Tôi đã không nhìn vào nó nhiều hơn thế, nhưng có thể có một phương thức setter cho phép tôi thay đổi giá trị mStartWhenPrepared thành true, điều này sẽ khiến video bắt đầu từ trình lắng nghe mặc định.

+0

Câu hỏi thú vị. – PedroAGSantos

Trả lời

3

Bạn đã cố gắng chuẩn bị() video của mình trước khi bạn gọi .start()?

từ các tài liệu: http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

với một OnPreparedListener bạn có thể bắt đầu video của bạn khi đã sẵn sàng của nó.

+0

Bạn không cần phải gọi chuẩn bị khi sử dụng VideoView. – MByD

+0

chuẩn bị là một phương pháp cho MediaPlayer, không phải là VideoView. Tôi cho rằng VideoView đang gọi chuẩn bị MediaPlayer bên dưới của nó như là một phần của phương thức setVideoPath(). Người nghe đã chuẩn bị có thể là những gì tôi cần. Tôi ma thử nghiệm nó với điều đó bây giờ và nó có vẻ là làm tốt hơn. Bạn sẽ nhận được câu trả lời đúng nếu mọi việc suôn sẻ. Cảm ơn – FoamyGuy