【问题标题】:Detect orientation of a recorded video in android在android中检测录制视频的方向
【发布时间】:2013-10-21 05:48:28
【问题描述】:

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

我尝试从视频文件中抓取帧并将其转换为 jpeg,但在所有情况下它始终提供方向 0

请帮助我。提前致谢。

【问题讨论】:

    标签: android video ffmpeg orientation javacv


    【解决方案1】:

    Api level 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);
    }
    

    【讨论】:

    • 我尝试使用String height = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); String width = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);,但无论是横向还是纵向,我的所有视频的尺寸都相同。所以这个答案非常好。我们必须将方向检查基于旋转。谢谢!
    • for me s is come 0 有什么解决办法吗?
    • 0 是视频的旋转,可以是090180270。使用它的人应该知道轮换标签可能并不总是可用。
    【解决方案2】:

    FFmpegMediaMetadataRetriever 可以做到这一点,它适用于 API 7+:

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

    【讨论】:

    • 我知道这已经有几年历史了,但值得一提的是——FFmpegMediaMetadataRetriever 库非常庞大——除非使用构建风格,否则这将为您的应用增加大约 18MB。除非您绝对需要 API 16 或更低版本的视频方向,否则我建议不要使用它。
    • 该库还为每个架构提供了预构建的 AAR,您可以制作单独的 APK。
    • @WilliamSeemann 如果您的库可以提供正确的宽度和高度,那就太好了。
    【解决方案3】:

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

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

    【讨论】:

    • 这种方式不是有问题吗,我知道在 KitKat 中根本不会调用回调。
    • 这就是我要说的。但我是根据我在论坛上阅读的内容而不检查它
    • 不幸的是,当视频旋转到 180 度时,这种方法无法帮助
    • 有时我让它工作,然后它说“视频无法播放”。所以我同意,这是错误的。不知道如何解决。
    • 它不适用于三星设备。我已经检查了三星 S5762。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2019-12-09
    • 1970-01-01
    • 2016-02-14
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多