2011-01-13 35 views
27

Ok vì vậy, đây là những gì tôi có cho đến nay. Tôi đã xây dựng FFmpeg trên android và am có thể sử dụng nó tốt. Tôi đã có thể tải video vào FFmpeg sau khi chuyển tên tệp đã chọn từ phía java. Để tiết kiệm hiệu suất, tôi đang viết trình phát video trong NDK thay vì chuyển các khung hình từ FFmpeg sang java thông qua JNI. Tôi muốn gửi khung hình từ video đến một bề mặt OpenGL. Tôi đang gặp khó khăn trong việc tìm ra cách để có được mỗi khung hình của video và đưa nó lên bề mặt OpenGL. Tôi đã bị mắc kẹt cố gắng tìm ra điều này trong một vài tuần nay mà không có may mắn. Hy vọng rằng ai đó có thể chỉ cho tôi đi đúng hướng.Trình phát video trên Android Sử dụng NDK, OpenGL ES và FFmpeg

Cảm ơn!

+0

Xin chào Kieran, Im đang cố chuyển đổi định dạng và phát âm thanh hoặc video bằng FFmpeg và android ndk. Tôi không tìm thấy bất kỳ tài nguyên hoặc hướng dẫn nào cho trang web này. Sau một thời gian dài tìm kiếm tôi tìm thấy liên kết này https://github.com/havlenapetr/FFMpeg. nhưng im không thể biên dịch và chạy ví dụ này. Xin hãy giúp tôi hoặc cung cấp cho tôi liên kết ref-- làm thế nào tôi có thể chơi âm thanh/video bằng cách sử dụng tập tin FFmpeg trong android .... Cảm ơn – praveenb

+0

Praveenb, Tôi đã có một thời gian khó khăn nhận FFmpeg cuối cùng biên dịch và có thể sử dụng cũng trên Android. Tôi đã phải chơi xung quanh với kịch bản cấu hình một chút. Tôi cũng không sử dụng phiên bản mới nhất của FFmpeg. Tôi đã tải xuống một phiên bản cũ hơn một chút vẫn sử dụng các hàm sws_scale để làm cho nó hoạt động. Tôi có thể làm hết sức mình để giúp bạn làm cho nó hoạt động chỉ cho tôi biết bạn đang ở đâu và loại lỗi nào bạn gặp phải. Nó không nên khó để có được các thư viện tĩnh để xây dựng. – DRiFTy

+0

Xin chào, tôi đang cố gắng xây dựng FFmpeg cho Android. Bạn có thể cho tôi biết cách bạn quản lý để xây dựng các thư viện tĩnh cho Android không? Có git-kho lưu trữ hoặc một cái gì đó tương tự mà tôi có thể bắt đầu với? Điều gì về kịch bản cấu hình đó - có gì để thiết lập? – j00hi

Trả lời

20

Một cách mà bạn cần lưu ý là vẽ các pixel của khung của bạn thành một kết cấu và sau đó hiển thị kết cấu đó bằng cách sử dụng OpenGL.

Tôi đã viết một bài đăng trên blog một thời gian về cách thực hiện việc này, chủ yếu cho các trò chơi video dựa trên pixel cũ, nhưng cũng áp dụng cho trường hợp của bạn. Bài đăng là Android Native Coding in C và tôi thiết lập github repository with an example. Sử dụng kỹ thuật này tôi đã có thể nhận được 60 FPS, ngay cả trên phần cứng thế hệ đầu tiên.

EDIT liên quan đến glTexImage2D vs glTexSubImage2D cho phương pháp này.

Gọi glTexImage2D sẽ cấp phát bộ nhớ video cho kết cấu của bạn và sao chép các điểm ảnh bạn truyền vào bộ nhớ đó (nếu bạn không vượt qua NULL). Gọi glTexSubImage2D sẽ cập nhật các pixel bạn chỉ định trong một kết cấu đã được phân bổ.

Nếu bạn cập nhật tất cả của kết cấu thì có rất ít sự khác biệt gọi một hoặc khác, trên thực tế glTexImage2D thường nhanh hơn. Nhưng nếu bạn chỉ cập nhật một phần của kết cấu glTexSubImage2D thắng trên tốc độ.

Bạn phải sử dụng kích thước kết cấu power-of-2, do đó, việc che phủ màn hình trên các thiết bị có độ phân giải cao yêu cầu kết cấu 1024x512 và kết cấu 512x512 ở độ phân giải trung bình. Các kết cấu lớn hơn diện tích màn hình (hi-res là 800x400-ish), có nghĩa là bạn chỉ cần cập nhật một phần của nó, vì vậy glTexSubImage2D là con đường để đi.

+0

Cảm ơn bạn đã phản hồi! Ya biết nó buồn cười Tôi đến trên blog của bạn một khi trở lại và tôi sử dụng đó như là một cơ sở cho haha ​​ứng dụng của tôi. Tôi đã không thể tìm thấy nó một lần nữa cho đến bây giờ vì vậy cảm ơn bạn đã cho tôi biết! Ngay bây giờ cuối cùng tôi đã có một cái gì đó để xuất hiện trên màn hình nhưng các điểm ảnh dường như hoàn toàn sai lầm. Tôi không chắc chắn nếu tôi đang tạo kết cấu hình chữ nhật của tôi một cách chính xác hoặc nếu nó là một vấn đề chuyển đổi sang định dạng pixel RGB chính xác trong FFmpeg. Tôi muốn có nhiều tài liệu OpenGL ES vì nó khá dễ dàng để làm điều này với quads trong OpenGL. Có lời khuyên nào không? – DRiFTy

+0

Bạn có thể sử dụng một quad với một kết cấu trên đó.Chỉ cần sử dụng 'glOrthof' và thiết lập các tọa độ đỉnh và kết cấu của bạn, tất cả như bạn thường làm trong OpenGL. Các pixel bị xáo trộn là một mô tả mơ hồ: chúng hoàn toàn không thể giải mã được không? Quá xanh hoặc quá đỏ? Có lẽ họ đang bị cắt ở bên trái? Lời khuyên của tôi: lấy mã làm việc trên PC bằng cách sử dụng tập hợp con của OpenGL chồng chéo với GLES, sau đó biên dịch mã chính xác giống với Android. Đó là những gì tôi thường làm. – richq

+0

Ok cảm ơn bạn đã cung cấp thông tin. Xin lỗi những gì tôi có nghĩa là bởi messed lên điểm ảnh là yea ​​họ là không thể giải mã. Trong FFmpeg, bạn phải sử dụng hàm sws_scale để chuyển đổi định dạng pixel thành RGG, nhưng đối với OpenGL, tôi vẫn đang học cách sử dụng nó và tôi không chắc chắn liệu tôi có chuyển đổi sang định dạng pixel đúng hay không lên đỉnh hình chữ nhật của tôi và kết cấu tọa độ chính xác. Ngoài ra kể từ khi tôi lặp qua mỗi khung nên được sử dụng glTexSubImage2d() hoặc tiếp tục sử dụng glTexImage2d() để thay thế các kết cấu hiện tại với dữ liệu kết cấu mới của tôi từ khung mới? – DRiFTy

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