汇总Android视频录制中常见问题

2019-12-10 19:34:20王冬梅

 四、视频文件旋转
      第三节中Step 1提到对视频文件的旋转,因为某些播放器会忽略录制视频时的配置参数,因此可尝试通过第三方库对视频文件进行旋转,例如:OpenCV,fastCV等,在Camera对象的Camera.PreviewCallback中截取每帧数据byte[] data,然后对其进行处理,然后输出。该方法需要考虑处理方法的高效性,在编程时一般采用NDK,在C++中完成关键的处理,这里贴出fastCV中该处理方法的逻辑。

public void onPreviewFrame( byte[] data, Camera c ) {
     // Increment FPS counter for camera.
     util.cameraFrameTick();

     // Perform processing on the camera preview data.
     update( data, mDesiredWidth, mDesiredHeight );

     // Simple IIR filter on time.
     mProcessTime = util.getFastCVProcessTime();

     if( c != null )
     {
      // with buffer requires addbuffer each callback frame.
      c.addCallbackBuffer( mPreviewBuffer );
      c.setPreviewCallbackWithBuffer( this );
     }

     // Mark dirty for render.
     requestRender();
   }
  };

      其中,update为native方法,其实现由jni中对应的文件完成,其中调用了libfastcv.a中相应的API。这里涉及NDK编程的基本方法步骤:(1)开发环境;(2)编写Java代码、C/C++代码;(3)编译C/C++文件生成.so库;(4)重新编译工程,生成apk。由于本章不重点讲述NDK,这里不再展开。

      除上述方法以外,笔者采用了另外一种思路进行了探索,上述方法处理的数据为每帧图像数据,可以理解为在线处理,而如果在录制完成之后再处理,可以理解为离线处理。这里采用了第三方库mp4parser,mp4parser是一款支持在Android中进行视频分割的库,这里通过其进行视频旋转。至于具体效果如何,读者有兴趣可自行尝试,这里留个悬念。

private boolean rotateVideoFileWithClockwiseDegree(String sourceFilePath, int degree) {
    if(!isFileAndDegreeValid(sourceFilePath, degree)) {
      return false;
    }
    rotateVideoFile(sourceFilePath, degree);
    return true;
  }

对输入参数进行合法性检测之后,根据检测结果判断是否进行旋转。

 

private boolean isFileAndDegreeValid(String sourceFilePath, int degree) {
    if(sourceFilePath == null || (!sourceFilePath.endsWith(".mp4")) 
                 || (!new File(sourceFilePath).exists())) {
      return false;
    }
    if (degree == 0 || (degree % 90 != 0)) {
      return false;
    }
    return true;
  }