2013-02-01 10 views
13

Moja aplikacja używa HLS do strumieniowego przesyłania wideo z serwera, ale gdy zażądam strumienia HLS z serwera, muszę przekazać mu maksymalną szybkość transmisji wideo, którą urządzenie może obsłużyć. W dokumencie Android API guides jest napisane, że "dostępne profile nagrywania wideo w urządzeniu mogą służyć jako proxy dla możliwości odtwarzania multimediów", ale kiedy próbuję pobrać wideoBitRate dla kamery skierowanej do tyłu urządzenia, zawsze wraca ona jako 12 Mb/s, niezależnie od urządzenie (Galaxy Nexus, Galaxy Tab Plus 7 ", Galaxy Tab 8.9), pomimo tego, że mają 3 różne procesory graficzne (PowerVR SGX540, Mali-400 MP, Tegra 250 T20). Oto mój kod, czy robię coś nie tak?Jak zdobyć CamcorderProfile.videoBitRate na urządzenie z systemem Android?

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

Gdy próbuję to na Galaxy Tab Plus:

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

zwraca prawda, pomimo faktu, że QUALITY_HIGH służy do nagrywania w rozdzielczości 1080p, a specyfikacja mówi, że może nagrywać tylko w rozdzielczości 720p.

+6

telefon komórkowy uruchamiany z systemem operacyjnym Android musi zapewniać pewne wartości, takie jak ta. czasami marki po prostu umieszczają pewną losową wartość na tych polach. Stawiałem czoła podobnemu problemowi, próbując uzyskać kąt widzenia kamery, w którym umieszcza się wartości takie jak 10 stopni, co jest niemożliwe do zniesienia. Prawdopodobnie masz ten sam problem. nie dają gówna. chcą po prostu wprowadzić smartfona na rynek i nie dbają o programistów –

Odpowiedz

7

Wygląda na to, że znalazłem odpowiedź na moje własne pytanie.

Nie przeczytałem dokładnie documentation, QUALITY_HIGH nie jest równoznaczne z 1080p, jest to po prostu sposób określenia profilu najwyższej jakości obsługiwanego przez urządzenie. Dlatego z definicji CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH) jest zawsze prawdziwe. Powinienem napisać coś takiego:

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; 
} 

Większość moich urządzeń są nadal raportowanie wsparcie dla kodowania 1080, którego jestem sceptyczny, jednak wpadłem ten kod na Xperia Tipo (moim urządzeniu testowym low end) i zanotował maksymalną jakość kodowania 480 pz wideoBitRate 720Kb/s.

Tak jak powiedziałem, nie jestem pewien, czy można zaufać każdemu urządzeniu, ale widziałem zakres bitrate wideo od 720Kb/s do 17Mb/si jakość profilu od 480p - 1080p. Mam nadzieję, że inne osoby uznają te informacje za użyteczne.

+0

Proszę zostawić komentarz, jeśli masz sugestie dotyczące poprawy mojej odpowiedzi. –

+0

Pełne ujawnienie: adogden i ja pracujemy w tej samej drużynie. Dałem nagrodę za to pytanie, aby pomóc nam ominąć ten irytujący problem. Prawdopodobnie zachęciło to do ponownego przyjrzenia się i napisania tej przydatnej odpowiedzi. Zdobył nagrodę, a ja mu ją przyznam, bez zamiaru przekazywania rep. –

Powiązane problemy