2014-09-17 36 views
5

Đây không phải là câu hỏi về việc phát hai video riêng biệt trong hai VideoView riêng biệt trên một hoạt động.Phát hai video trong một VideoView cùng một lúc

Tôi đã được yêu cầu xem liệu có thể tạo hoạt động với một VideoView duy nhất hay không. Khi người dùng mở Hoạt động, họ được yêu cầu chọn video cơ sở và sau đó chọn video thứ hai. Cả hai video sẽ được phát trong một VideoView cùng một lúc, nhưng video cơ sở sẽ có alpha là 255 và video thứ hai sẽ có alpha là 150.

Để thử nghiệm, các tệp video trên điện thoại sẽ làm.

Tại thời điểm này, tôi chỉ có thể tạo hoạt động phát một video trong VideoView. Tôi nghĩ nếu tôi tạo một lớp VideoView tùy chỉnh, tôi có thể ghi đè lên chức năng onDraw và bằng cách nào đó lấy khung hình video từ video thứ hai, áp dụng alpha và sau đó vẽ lại nó trên canvas của VideoView đầu tiên, nhưng tôi không biết bắt đầu từ đâu .

Mối quan tâm khác của tôi với quy trình này là lượng bộ nhớ được sử dụng để phát hai video cùng một lúc trong một VideoView cũng như xử lý cần thiết để áp dụng alpha và sau đó vẽ lại liên tục mà không ảnh hưởng đến hiệu suất hoặc phát lại video .

Tôi không biết bắt đầu từ đâu hoặc cách tốt nhất để tiếp cận điều này và nếu có thể, hy vọng sẽ có một số hướng dẫn về phương pháp hoặc đối tượng để sử dụng.

Tôi đang phát triển một ứng dụng demo để hiển thị ứng dụng khách trên hệ thống Android 2.2 bằng Eclipse. Tôi không muốn nhắm mục tiêu đến bất kỳ hệ thống cao hơn nào vào thời điểm này vì điện thoại chạy thử Android 2.2.

+0

Bạn có thể sử dụng 2 Chế độ xem video ở phía trên kia. khung của cả hai chế độ xem video sẽ giống nhau. dù sao thì không thể phát 2 video khác nhau cùng một lúc trong một VideoView. – Deepak

Trả lời

1

Tôi không hoàn toàn chắc chắn lý do bạn muốn sử dụng VideoView như thế. VideoViews chỉ sử dụng một MediaPlayer và sử dụng nó để đồng bộ một video trên đầu trang của một video khác có thể sẽ yêu cầu thực hiện rất kludgey của hai MediaPlayers thông qua cùng một lớp con VideoView, hiển thị trên cùng một bề mặt.

Hãy xem the source code để xem cách MediaPlayer hiển thị video bên trong VideoView và cách MediaController kiểm soát phát lại. Bạn có thể hack xung quanh để có hai điểm MediaPlayers cùng một lúc với cùng một VideoView/SurfaceView. Hoặc bạn có thể phân lớp MediaPlayer để xử lý nhiều nguồn dữ liệu.

Thực hiện một trong những điều này là ngược lại với những gì mà VideoView và MediaPlayer được tạo và hiệu suất sẽ đạt được thành công lớn.

Nếu sử dụng VideoView không phải là yêu cầu khó, thì đề xuất của tôi là sử dụng thư viện video hiện có như ffmpeg, dễ dàng hơn và hiệu quả hơn viết lại các lớp phương tiện cơ sở (báo trước: sử dụng ffmpeg sẽ yêu cầu NDK, Tôi khuyên bạn nên sử dụng existing ffmpeg wrapper để tiết kiệm thời gian).

Khi ffmpeg được thêm vào dự án của bạn, việc áp dụng video phụ là OverlayVideoFilter sẽ khá dễ dàng và cho phép bạn xếp lớp một video lên đầu video khác (mặc dù việc điều khiển phát lại đồng thời có thể là một thách thức đối với bạn) .

Đường dẫn chính xác để thực hiện có thể phụ thuộc vào những gì bạn muốn làm với video ghép khi bạn nhận được (xuất video dưới dạng một video, điều khiển phát lại, v.v.).

+1

Xin chào Andrew, cảm ơn bạn đã bình luận của bạn. Sau khi đăng câu hỏi này, tôi bắt đầu tìm kiếm trong ffmpeg, nhưng không tìm thấy lớp Overlay VideoFilter mà bạn đã đề cập. –

1

Không thể phát hai video trong một VideoView.Điều này là do VideoView thực tế là SurfaceView mở rộng, vừa lỗi thời và chưa bao giờ hoạt động tốt để bắt đầu. (chi tiết về điều này ở dưới cùng)

Tôi không biết tại sao bạn có yêu cầu khó khăn khi sử dụng VideoView vì nó rất đơn giản và sẽ không cung cấp cho bạn những gì bạn cần.

Nếu yêu cầu của bạn cho VideoView là vì bạn muốn giữ chức năng điều khiển phương tiện và chức năng phát lại, bạn nên thực hiện Chế độ xem tùy chỉnh. Mở rộng LinearLayout và thêm hai SurfaceView vào nó với trọng số là 1. Sao chép nội dung của VideoView.java và đặt nó vào Chế độ xem mới của bạn và thực hiện các sửa đổi để xử lý hai SurfaceViews phát hai video một cách đồng bộ.

Bạn nên sử dụng TextureViews thay vì SurfaceViews, được bổ sung trong api 14. Nó khắc phục nhiều thiếu sót của SurfaceView và xử lý những thứ như hình động tốt hơn so với VideoView.

+0

Xin chào Doge, cảm ơn bạn đã bình luận của bạn. Tôi đã nghĩ đến việc sử dụng TextureViews, nhưng nó đã được thêm vào trong api 14 và tôi đang tìm cách nhắm mục tiêu api 8 trên các hệ thống Android 2.2. –

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