2015-03-13 19 views
7

Tôi đang sử dụng libvlc trên và ứng dụng android để phát luồng mạng; mã gốc vẽ hình ảnh trên một surfaceview.Phát hiện nếu Android SurfaceView đang vẽ/di chuyển

Giả sử video dừng và tôi không có quyền truy cập vào mã gốc, làm thế nào tôi có thể phát hiện nếu SurfaceView vẫn đang chuyển động (video không bị đóng băng)?

Tôi đã thử getViewTreeObserver(). AddOnDrawListener(); và getViewTreeObserver(). addOnPreDrawListener(); nhưng họ không có hiệu ứng tôi đang tìm kiếm.

Cảm ơn

+0

Bạn có đang sử dụng trình phát đa phương tiện ở chế độ xem bề mặt để chạy video không? – Ahmed

+0

Tôi đang sử dụng vlc, chạy trên mã gốc – Ambi

Trả lời

6

Bạn không thể lấy thông tin đó từ SurfaceView, vì chính SurfaceView không biết.

Công việc của SurfaceView là thiết lập Bề mặt và tạo một lỗ trong bố cục Xem mà bạn có thể xem qua. Một khi nó đã làm những việc này, nó không còn tích cực tham gia vào quá trình hiển thị video nữa. Nội dung từ bộ giải mã đến Surface, được quản lý bởi SurfaceFlinger (bộ ghép đồ họa hệ thống).

Đây là ví dụ về cách hoạt động của video DRM. Ứng dụng "phát" video không có quyền truy cập vào các khung video được bảo vệ bởi DRM. (Không SurfaceFlinger, thực sự, nhưng đó là một câu chuyện dài hơn.)

Cách tốt nhất để biết nội dung vẫn đến là hỏi nguồn video nếu nó vẫn gửi nội dung cho bạn. Một cách tiếp cận khác là thay đổi SurfaceView thành TextureView và cung cấp phương thức gọi lại onSurfaceTextureUpdated().

+0

Tôi đã thử phương pháp này, tiếc là cuộc gọi lại cũng được thực hiện nếu hình ảnh bị đóng băng và không thay đổi nữa. Vì vậy, điều này không thể được sử dụng để phát hiện xem luồng có bị đóng băng không. –

+0

@Seppl Nếu cuộc gọi lại đang kích hoạt, điều đó thường có nghĩa là các khung hình mới đang được phân phối. Không có kiểm tra cho dù khung mới có chứa cùng nội dung như khung trước đó hay không. Nếu bạn nhìn vào nguồn (https://android.googlesource.com/platform/frameworks/base/+/marshmallow-mr1-release/core/java/android/view/TextureView.java # 426) bạn sẽ thấy cuộc gọi lại chỉ kích hoạt khi 'mUpdateLayer' được đặt. Điều đó được thiết lập bởi 'updateLayer()', được gọi khi khung đến nhưng cũng trên một số bản cập nhật ứng dụng (thay đổi kích thước, Xem được hiển thị, v.v.). Các cuộc gọi đều đặn cho biết các khung đang đến. – fadden

1

Tôi không chắc chắn những gì chính xác những gì bạn đang cố gắng để đạt được ở đây nhưng bạn có thể thấy nếu nhìn bề mặt được render hay không thông qua việc thực hiện một giao diện được gọi là SurfaceHolder.Callback mà cung cấp cho bạn truy cập vào các phương pháp sau đây,

  1. Khi tạo bề mặt - Điều này được gọi ngay sau khi bề mặt được tạo lần đầu tiên.

  2. Trên bề mặt đã thay đổi - Điều này được gọi ngay lập tức sau khi bất kỳ thay đổi cấu trúc nào (định dạng hoặc kích thước) đã được đưa lên bề mặt.

  3. Trên bề mặt bị phá hủy - Điều này được gọi ngay trước khi bề mặt bị phá hủy.

Hãy xem documentation để xem bề mặt. Đối với SurfaceHolder hãy xem điều này link. Về cơ bản để biết

+0

Tôi đã thử đường dẫn này, nhưng nó không giúp cho vấn đề của tôi. Tôi đang cố gắng phát hiện xem video có đang phát hay không hoặc nó chỉ hiển thị một khung. Khi điều này xảy ra, bề mặt đã được kích hoạt onCreate và onChanged. – Ambi

+0

Các cuộc gọi lại trên SurfaceView không hữu ích cho việc này - chúng không kích hoạt cập nhật nội dung. – fadden

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