在android中检测录制视频的方向

ult*_*ate 16 video android ffmpeg orientation javacv

我想制作我的自定义媒体播放器并需要视频的方向信息(用于检测它是从前置或后置摄像头录制的).对于jpeg图像我可以使用,ExifInterface.TAG_ORIENTATION但对于视频如何我可以找到这些信息.

我试图从视频文件中获取帧并将其转换为jpeg但是它总是0在所有情况下提供方向.

请帮我.提前致谢.

Ram*_*ula 18

Api等级17后,我们可以提取视频的方向: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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试使用`字符串高度= m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); 字符串宽度= m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);`但是我所有的视频都显示为相同大小,无论是横向还是纵向。所以这个答案很好。我们必须基于旋转进行方向检查。谢谢! (2认同)
  • 对我来说 s 即将到来 0 有什么解决办法吗? (2认同)

ult*_*ate 2

经过太多的努力,我开始知道媒体播放器提供了视频文件的高度和宽度,我们可以从中找到视频的旋转。

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();
  }
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,当视频旋转到 180 度时,这种方法无济于事 (3认同)
  • 这种方式不是有问题吗,我知道在 KitKat 中回调根本不会被调用。 (2认同)