以纵向模式拍摄的旋转视频

Posted

技术标签:

【中文标题】以纵向模式拍摄的旋转视频【英文标题】:Rotating video taken in portrait mode 【发布时间】:2011-11-15 12:32:24 【问题描述】:

我的应用让用户捕捉视频:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_VIDEO_REQUEST); 

或图片:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 

就图片而言,我可以判断它们是否是在横向以外的任何模式下拍摄的,然后在将它们上传到网络之前旋转它们:

ExifInterface exif = new ExifInterface(fileName);
int exifOrientation = Integer.parseInt(exif.getAttribute(ExifInterface.TAG_ORIENTATION));
float rotate = 0;
switch (exifOrientation)
case ExifInterface.ORIENTATION_ROTATE_90:
    rotate = 90;
    break;
case ExifInterface.ORIENTATION_ROTATE_180:
    rotate = 180;
    break;
case ExifInterface.ORIENTATION_ROTATE_270:
    rotate = 270;
    break;


if(rotate > 0)
    Bitmap bitmap = BitmapFactory.decodeFile(fileName);
    Matrix matrix = new Matrix();
    matrix.postRotate(rotate);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    OutputStream outStream = context.getContentResolver().openOutputStream(Uri.fromFile(file));
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

我如何通过视频实现同样的效果?

【问题讨论】:

***.com/questions/3937387/rotating-videos-with-ffmpeg 是的,我想我可以将它按原样发布到服务器并在那里运行 flvtool 和 ffmpeg。无论如何要在设备中执行此操作吗? 嘿@shaharsol,你有没有找到这个问题的解决方案?我面临同样的问题。 我也有同样的问题,谁能提供有效的答案。我在录制后上传视频并在上传后更改方向 【参考方案1】:

我似乎没有完全理解你的问题。以下是一些我认为至少可以引导您朝着正确方向前进的问题。希望对你有帮助

    是否要旋转视频以使用 MediaPlayer 播放?

    是否要更改视频文件中的硬代码以使其在各处旋转播放?

    旋转缓冲视频方向?

================================================ ==================================== 问题 #1 的答案:

//rotating a SurfaceView that contains the MediaPlayer
/*
    Create a new MediaPlayer SurfaceView, then use the SurfaceHolder interface
*/
video = new SurfaceView();
video.getHolder().setType(SurfaceHolder.SURFACE_TYPE_NORMAL);

video.getHolder().lockCanvas().rotate(90);

问题 #2 的答案:

至于更改视频的硬代码。我建议使用一个不错的 GUI 视频编解码器来旋转视频,它应该保存它的设置。否则,您将不得不从解码器访问源代码,然后根据我的建议访问您的 SOL。

第 3 个问题的答案:

下面的帖子解释了如何旋转缓冲视频和/或更改其在不同模式下的方向设置。

在这里发帖:Android VideoView orientation change with buffered video

================================================ ====================================

如果这对你没有帮助,那么我相信它会帮助其他人,祝你好运。

【讨论】:

>video.getHolder().lockCanvas().rotate(90);这不适用于 MediaPlayer,因为它显示未知错误并且不播放视频。 @Ernest 你在使用 .... video.getHolder().setType(SurfaceHolder.SURFACE_TYPE_NORMAL);或 video.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ? 已经好几年了,但我相信这对我有用。如果它不起作用,可以尝试...***.com/questions/8327774/…

以上是关于以纵向模式拍摄的旋转视频的主要内容,如果未能解决你的问题,请参考以下文章

相机预览处于纵向模式,但拍摄的图像已旋转

以纵向模式从相机拍摄的加载到画布上的照片是横向的

以人像模式拍摄后旋转的照片

以纵向拍摄的照片正在以横向保存

Android CameraX 图像旋转

Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频