2013-10-21 14 views
14

Chcę zrobić mój niestandardowy odtwarzacz multimedialny i wymaga informacji o orientacji wideo (w celu wykrycia go jest rejestrowany z przedniej lub tylnej kamery). dla obrazów jpeg mogę użyć ExifInterface.TAG_ORIENTATION, ale dla wideo, w jaki sposób mogę znaleźć te informacje.Wykryj orientację nagranego wideo w Androidzie

Próbowałem pobrać ramkę z pliku wideo i przekonwertować ją do formatu JPEG, ale zawsze zawsze zapewnia orientację 0 we wszystkich przypadkach.

Proszę, pomóż mi. Z góry dziękuję.

Odpowiedz

1

Po zbytniego wysiłku Przyszedłem wiedzieć, że odtwarzacz multimediów zapewnia wysokość i szerokość pliku wideo, z którego możemy obrócić rotację wideo.

MediaPlayer mp = new MediaPlayer(); 
    try { 
     mp.setDataSource(viewSource); 
     mp.prepare(); 
     mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { 
      @Override 
      public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 

       int orientation = -1; 

       if(width < height){ 
        orientation = 0; 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);} 
       else{ 
        orientation = 1; 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);} 

      } 
     }); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+1

nie jest w ten sposób błędny, zrozumiałem, że w KitKat wywołanie zwrotne nie jest w ogóle wywoływane. – Nativ

+0

@powerX co chcesz powiedzieć? czy to nie działa w kitkacie ???? – ultimate

+0

To jest dokładnie to, co mówię. Ale opieram to na tym, co czytam na forach, bez sprawdzania tego. – Nativ

14

Api poziom 17 później, możemy wyodrębnić orientację wideo: MediaMetadataRetriever

MediaMetadataRetriever m = new MediaMetadataRetriever(); 

m.setDataSource(path); 
Bitmap thumbnail = m.getFrameAtTime(); 
// 
if (Build.VERSION.SDK_INT >= 17) { 
    String s = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); 

    Log.e("Rotation", s); 
} 
+1

Próbowałem za pomocą 'wysokość String = m.extractMetadata (MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); Szerokość łańcucha = m.extractMetadata (MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); 'ale wszystkie moje filmy są tej samej wielkości, niezależnie od tego, czy są w krajobrazie czy w pionie. Tak więc ta odpowiedź jest bardzo dobra. Musimy oprzeć kontrolę orientacji na rotacji. Dziękuję Ci! – Azurespot

+0

dla mnie nadchodzi 0 jakieś rozwiązanie? – Narendra

2

FFmpegMediaMetadataRetriever może to zrobić i działa z API 7+:

FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever(); 
fmmr.setDataSource(path); 
String rotation = fmmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); 
Log.e("Rotation", rotation); 
fmmr.release(); 
+0

Wiem, że to jest kilka lat, ale za to, co jest warte - biblioteka FFmpegMediaMetadataRetriever jest masywna - o ile nie użyjesz wersji buildowych, doda to około 18 MB do twojej aplikacji. O ile nie potrzebujesz bezwzględnej orientacji wideo w API 16 lub mniej, nie polecam tego. –

+0

Biblioteka oferuje również wstępnie zbudowane AAR dla każdej architektury, możesz tworzyć pojedyncze pakiety APK. –

Powiązane problemy