2013-02-01 16 views
13

Ứng dụng của tôi sử dụng HLS để truyền video từ máy chủ, nhưng khi tôi yêu cầu luồng HLS từ máy chủ, tôi cần phải truyền tốc độ bit video tối đa mà thiết bị có thể xử lý. Trong số Android API guides nó nói rằng "hồ sơ quay video có sẵn của thiết bị có thể được sử dụng làm proxy cho khả năng phát lại phương tiện", nhưng khi tôi cố gắng truy xuất videoBitRate cho các thiết bị quay mặt về phía sau, nó luôn quay lại 12Mb/s bất kể thiết bị (Galaxy Nexus, Galaxy Tab Plus 7 ", Galaxy Tab 8.9), mặc dù thực tế là họ có 3 GPU khác nhau (PowerVR SGX540, Mali-400 MP, Tegra 250 T20). Đây là mã của tôi, tôi có làm gì sai không?Làm thế nào để có được CamcorderProfile.videoBitRate cho một thiết bị Android?

CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
targetVideoBitRate = camcorderProfile.videoBitRate; 

Nếu tôi cố gắng này trên Galaxy Tab Plus:

boolean hasProfile = CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH); 

nó sẽ trả về True, mặc dù thực tế rằng QUALITY_HIGH dành cho quay phim 1080p và thông số kỹ thuật cho biết nó chỉ có thể ghi ở 720p.

+6

điện thoại di động sẽ được khởi chạy với hệ điều hành Android phải cung cấp một số giá trị như vậy. đôi khi các thương hiệu chỉ đặt một số giá trị ngẫu nhiên vào các trường đó. Tôi phải đối mặt với một vấn đề tương tự khi cố gắng để có được góc nhìn của máy ảnh, nơi họ đặt các giá trị như 10 độ, đó là không thể khắc phục. Bạn có thể có cùng một vấn đề. họ không đưa ra một shit. họ chỉ muốn đặt một điện thoại thông minh trên thị trường và không quan tâm đến các lập trình viên –

Trả lời

7

Có vẻ như tôi đã tìm thấy câu trả lời cho câu hỏi của riêng mình.

Tôi không đọc đủ documentation, QUALITY_HIGH không tương đương với 1080p, đây chỉ đơn giản là cách chỉ định cấu hình chất lượng cao nhất mà thiết bị hỗ trợ. Do đó, theo định nghĩa, CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH) luôn đúng. Lẽ ra tôi nên viết một cái gì đó như thế này:

public enum mVideoQuality { 
    FullHD, HD, SD 
} 
mVideoQuality mMaxVideoQuality; 
int mTargetVideoBitRate; 

private void initVideoQuality { 
    if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) { 
     mMaxVideoQuality = mVideoQuality.FullHD; 
    } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) { 
     mMaxVideoQuality = mVideoQuality.HD; 
    } else { 
     mMaxVideoQuality = mVideoQuality.SD; 
    } 
    CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    mTargetVideoBitRate = cProfile.videoBitRate; 
} 

Hầu hết các thiết bị của tôi vẫn báo cáo hỗ trợ cho mã hóa 1080p, mà tôi hoài nghi về, tuy nhiên tôi chạy mã này trên Sony Xperia Tipo (thiết bị thử nghiệm cuối thấp của tôi) và nó đã báo cáo chất lượng mã hóa tối đa là 480p với videoBitRate là 720Kb/s.

Như tôi đã nói, tôi không chắc liệu mọi thiết bị có thể tin cậy hay không nhưng tôi đã thấy một loạt tốc độ bit của video từ 720Kb/s đến 17Mb/giây và Chất lượng hồ sơ từ 480p - 1080p. Hy vọng rằng những người khác sẽ thấy thông tin này hữu ích.

+0

Xin vui lòng để lại một bình luận nếu bạn có đề xuất để cải thiện câu trả lời của tôi. –

+0

Tiết lộ đầy đủ: adogden và tôi làm việc trên cùng một nhóm. Tôi đặt một tiền thưởng vào câu hỏi này để giúp chúng tôi vượt qua vấn đề khó chịu này. Điều đó có thể nhắc nhở adogden để có một cái nhìn khác và viết câu trả lời hữu ích này. Anh ta kiếm được tiền thưởng, và tôi trao nó cho anh ta, mà không có ý định chuyển đại diện. –

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