四、视频文件旋转
第三节中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;
}










