我从FRONT CAMERA录制三星Galaxy S4(1080wx1920h)的视频。 生成的视频旋转90°并上下颠倒。 (见图)
然后我拍摄视频(最终分辨率为320wx240h)并将其显示在TextureView上:
textureView.setRotation(90.0f);
textureView.setScaleX(-1);
我将textureView的布局参数设置为:
ViewGroup.LayoutParams params = textureView.getLayoutParams();
params.height = 1440;
params.width = 1080;
textureView.setLayoutParams(params);
结果如下:
经过多次重试,我想到如果我将布局设置为:
params.height = 810;
params.width = 1080;
尺寸比例保持正确:
最后我想显示在RecordingActivity(1080wx1440h)中录制的视频:
关于如何做到这一点的任何想法?
或者有没有办法如何正确旋转从前置摄像头录制视频?
完整活动代码:
import android.app.Activity;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.TextureView;
import android.view.ViewGroup;
public class ReplayActivity extends Activity implements TextureView.SurfaceTextureListener {
private String pathToVideo;
private TextureView textureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_replay);
textureView = (TextureView)findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(this);
textureView.setRotation(90.0f);
textureView.setScaleX(-1);
pathToVideo = getIntent().getStringExtra("path");
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setSurface(new Surface(surface));
try {
mediaPlayer.setDataSource(pathToVideo);
mediaPlayer.prepare();
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);//x = 1080, y = 1920
Point videoDimensions = new Point(mediaPlayer.getVideoWidth(),mediaPlayer.getVideoHeight());//x = 320, y = 240
Point resultParams = VideoHelpers.getScaledDimension(new Point(videoDimensions.y * 1000, videoDimensions.x * 1000), size);//x = 1080, y = 1440
ViewGroup.LayoutParams params = textureView.getLayoutParams();
params.height = resultParams.y;//1440
params.width = resultParams.x;//1080
textureView.setLayoutParams(params);
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {return false;}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
}
XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000">
<TextureView
android:id="@+id/texture_view"
android:layout_width="wrap_content"
android:background="#000000"
android:layout_height="wrap_content" />
</RelativeLayout>
答案 0 :(得分:0)
使用相机,预览,纹理和矩阵可能会很棘手。
请记住,相机的自然方向是横向的,因此如果您不做任何其他操作,生成的视频将处于该方向。此外,预览帧将是横向的。
当你执行textureView.setRotation(90.0f);
和textureView.setScaleX(-1);
时,你只是在修改纹理的内部转换矩阵,这就是,当内部绘制某些内容时,会发生转换,并且您看到的是不同的实际内容。这很好,但实际上相机不知道任何关于这种旋转和媒体记录的事情。
如果您正在使用Mediarecorder,请查看
MediaRecorder.html#setOrientationHint(int)
设置输出视频播放的方向提示。这种方法 应该在prepare()之前调用。这种方法不会触发 源视频帧在视频录制过程中旋转,但要添加一个 包含输出视频中旋转角度的合成矩阵 如果输出格式是OutputFormat.THREE_GPP或OutputFormat.MPEG_4 这样视频播放器就可以选择正确的播放方向。 请注意,某些视频播放器可能会选择忽略构图 播放期间视频中的矩阵。
<强>参数强>
度以度为单位顺时针旋转的角度。该 支持的角度为0度,90度,180度和270度。
如果你正在使用其他录音方法,可能你应该看看
Camera.Parameters.html#setRotation(int)
或