2012-04-25 21 views
14

Tôi có thể lấy dữ liệu khung RGBA từ máy ảnh và tôi muốn mã hóa dữ liệu ở định dạng H.264. Tôi đã sử dụng FFmpeg để mã hóa và giải mã video H.264, nhưng ở kích thước khung 640x480 thì nó quá chậm đối với nhu cầu của tôi.Tôi làm cách nào để thực hiện mã hóa và giải mã H.264 tăng tốc phần cứng để phát trực tuyến?

Tôi muốn sử dụng tăng tốc phần cứng để tăng tốc độ mã hóa và giải mã, vì vậy tôi sẽ làm điều đó như thế nào?

Ngoài ra, tôi cần có thể phát video được mã hóa trên mạng và giải mã nó ở đầu bên kia. Điều này có thể giải quyết như thế nào?

+0

Tiêu đề của câu hỏi là ".. giải mã video", nhưng câu hỏi thực tế là về mã hóa, phải không? Có lẽ, bạn nên chỉnh sửa tiêu đề? – Anastasia

+0

Có một thư viện cho phép mã hóa khung hình thô thành H.264: http://www.foxitsolutions.com/iphone_h264_sdk.html. Thư viện này sử dụng bộ mã hóa phần cứng và cung cấp khung H.264 riêng biệt. Vui lòng xem câu hỏi và câu trả lời này: http://stackoverflow.com/questions/7979842/video-encoding-libraries-for-ios/ – Anastasia

+0

Có thể một bản sao: http://stackoverflow.com/questions/25197169/how-to- giải mã-ah-264-frame-on-ios-by-phần cứng-giải mã –

Trả lời

18

Nếu bạn muốn mã hóa video và giải mã video H.264 tăng tốc phần cứng trên iOS, cách duy nhất để thực hiện là AVFoundation. Không sử dụng thư viện của bên thứ ba để mã hóa hoặc giải mã, bởi vì tất cả các thư viện này hiện đang bị ràng buộc CPU và chậm hơn nhiều so với những gì bạn nhận được từ AVFoundation. Một lý do để sử dụng bộ mã hóa hoặc bộ giải mã của bên thứ ba là nếu bạn đang làm việc với một định dạng không được hỗ trợ trong iOS theo mặc định.

Để giải mã được tăng tốc phần cứng, bạn sẽ muốn sử dụng một cá thể AVAssetReader (hoặc một trong các lớp trình phát để phát lại thuần túy). Với một AVAssetReader, tôi thường xuyên nhận được tốc độ phát lại 2X hoặc cao hơn để đọc video mã hóa H.264, do đó thiết bị iOS sử dụng một số tăng tốc phần cứng khá tốt cho điều đó.

Tương tự, đối với mã hóa được tăng tốc, bạn sẽ sử dụng AVAssetWriter. Có một số thủ thuật để nhận được AVAssetWriter để mã hóa ở tốc độ tốt nhất (cho vào khung BGRA, sử dụng vùng đệm pixel, sử dụng bộ đệm kết cấu iOS 5.0 nếu đọc từ OpenGL ES), mà tôi mô tả chi tiết trong phạm vi this answer.

Nếu bạn muốn xem một số mã sử dụng đường dẫn nhanh nhất mà tôi đã tìm thấy để mã hóa và giải mã nhanh hơn, bạn có thể xem khung nguồn mở GPUImage của mình, không giống như mã được liên kết bởi Anastasia. .

+1

Cảm ơn bạn đã mã nguồn của bạn và nhìn thô, nhưng không tìm thấy chức năng hoặc các thông số truy cập để mã hóa hoặc giải mã dữ liệu, tôi cần phải có được mã hóa dữ liệu được gửi qua mạng, và sau đó ở đầu kia của thiết bị đầu cuốidecoding, nếu bạn đã có giao diện hoặc chức năng, nhưng tôi không tìm thấy hy vọng để nhận được sự giúp đỡ của bạn, cảm ơn bạn rất nhiều – king

+1

lib của bạn là tuyệt vời nhưng nó là để áp dụng bộ lọc và xử lý video thô nhưng nó không giúp ích gì với câu hỏi thực tế là mã hóa phần cứng. Nếu người dùng muốn gửi dữ liệu nén qua mạng thì không có api nào ở trên (trình đọc tài sản và trình ghi nội dung) sẽ không trợ giúp. –

+0

@king - Đó có thể là chi tiết bạn muốn thêm vào câu hỏi, bởi vì bạn không chỉ định rằng bạn muốn truy cập vào luồng đầu vào và đầu ra thô để truyền qua mạng. Câu trả lời của tôi áp dụng cho việc mã hóa và giải mã các tệp, trong đó AVAssetReader và AVAssetWriter rõ ràng là cách để đi. Tuy nhiên, bạn sẽ sử dụng AVFoundation để làm mã hóa của bạn ở đây, như được mô tả bởi mohsenr: http://stackoverflow.com/a/3484950/19679. –