如何通过在android或java中捕获动画视图来制作视频文件?
我制作了一个如何通过在android或java中捕获动画视图来制作视频文件?,java,android,video-capture,Java,Android,Video Capture,我制作了一个imageView从屏幕的一侧到另一侧的动画。以下是java代码: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_
imageView
从屏幕的一侧到另一侧的动画。以下是java代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView = findViewById(R.id.imageView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleAnimation(imageView);
}
});
}
public void handleAnimation(View view) {
ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "x", 1000f);
animatorX.setDuration(2000);
animatorX.start();
}
}
这是当用户点击动画按钮时我们看到的:
现在我的问题是,如何通过捕获动画的图像视图来制作视频文件
编辑:
我需要的是:我想制作一个应用程序,从用户那里拍摄一些照片,在照片和一些效果上制作一些动画,并将它们与所需的声音混合,最后导出一个视频剪辑。当然,如果可以的话,我宁愿把所有这些东西都隐藏起来。有两种可能的方法来存档
1-您可以通过使用javacv库(FFmpeg)组合从视图中获取的一组位图来实现这一点
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("/sdcard/test.mp4",256,256);
try {
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.setFrameRate(30);
recorder.setPixelFormat(avutil.PIX_FMT_YUV420P10);
recorder.setVideoBitrate(1200);
recorder.startUnsafe();
for (int i=0;i< 5;i++)
{
view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
view.setDrawingCacheEnabled(false);
recorder.record(bitmap);
}
recorder.stop();
}
catch (Exception e){
e.printStackTrace();
}
FFmpegFrameRecorder=新的FFmpegFrameRecorder(“/sdcard/test.mp4”,256256);
试一试{
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
记录器.setFormat(“mp4”);
记录器。设置帧率(30);
setPixelFormat(avutil.PIX_FMT_YUV420P10);
记录器。设置视频比特率(1200);
记录器。startUnsafe();
对于(int i=0;i<5;i++)
{
view.setDrawingCacheEnabled(true);
位图Bitmap=Bitmap.createBitmap(v1.getDrawingCache());
view.setDrawingCacheEnabled(false);
录制(位图);
}
录音机。停止();
}
捕获(例外e){
e、 printStackTrace();
}
使用此库的所有代码都是
2-您可以使用此链接记录屏幕并根据需要使用。
您必须录制屏幕,然后使用视图的xy
坐标裁剪视频。您可以在android(5)及以上版本上使用MediaProject API
录制屏幕
private VirtualDisplay mVirtualDisplay;
private MediaRecorder mMediaRecorder;
private MediaProjection mMediaProjection;
private MediaProjectionCallback callback;
MediaProjectionManager projectionManager = (MediaProjectionManager)
context.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mMediaProjection.registerCallback(callback, null);
initRecorder();
mMediaRecorder.prepare();
mVirtualDisplay = createVirtualDisplay();
mMediaRecorder.start();
public void initRecorder() {
path = "/sdcard/Record/video" + ".mp4";
recId = "capture-" + System.currentTimeMillis() + ".mp4";
File myDirectory = new File(Environment.getExternalStorageDirectory(), "Record");
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncodingBitRate(MainFragment.bitRate);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(MainFragment.DISPLAY_WIDTH,
MainFragment.DISPLAY_HEIGHT);
mMediaRecorder.setOutputFile(path);
}
private VirtualDisplay createVirtualDisplay() {
return mMediaProjection.createVirtualDisplay("MainActivity",
MainFragment.DISPLAY_WIDTH, MainFragment.DISPLAY_HEIGHT, MainFragment.screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
}
public class MediaProjectionCallback extends MediaProjection.Callback {
@Override
public void onStop() {
mMediaRecorder.stop();
// mMediaRecorder.reset();
mMediaRecorder.release();
mMediaProjection.unregisterCallback(callback);
mMediaProjection = null;
mMediaRecorder = null;
}
完成后,只需调用mmediprojection.stop()
即可完成录制并将视频另存为tmp
之后,您可以在视图使用的xy
坐标处裁剪视频
其中选项如下:
out\u w
是输出矩形的宽度
out\u h
是输出矩形的高度
x
和y
指定输出矩形的左上角
那么你的情况呢
String cmd ="-i '"+ tmpVideoPath+"' -filter:v "+"'crop="+view.getWidth()+":"+view.getHeight()+":"+view.getX()+":"+view.getY()+"'"+" -c:a copy "+outVideoPath
FFmpeg ffmpeg = FFmpeg.getInstance(context);
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {}
@Override
public void onProgress(String message) {}
@Override
public void onFailure(String message) {}
@Override
public void onSuccess(String message) {}
@Override
public void onFinish() {}
});
非常感谢。因为我只想捕捉图像的动画,而不是所有的视图,所以我认为我应该使用第一种方法。但我不知道如何将FFmpeg库集成到android studio中。你能帮我看看那个链接吗?但我什么都不懂!!这将无法很好地工作,因为您正在主线程上执行所有操作。您的视频将显示滞后,因为绘图缓存不是每秒绘制一次@Niza Siwale您是对的。有什么办法解决我的问题吗?屏幕录制的问题是应用程序必须在前台,整个动画必须播放。假设你想把它作为视频下载,然后把应用放在后台,这可能不起作用,取决于用例。谢谢。但这不是我需要的。我想记录一个特定的布局,其所有子视图的大小与设备屏幕的大小相同。这样我就可以省略其他视图。你是什么意思?为什么你不能简单地更改其他视图的alpha或者你可以更改从中裁剪视频的位置?我需要的是:我想制作一个应用程序,从用户那里拍摄一些照片,在照片和一些效果上制作一些动画,并将它们与所需的声音和效果混合最后导出一个视频剪辑。当然,如果可以的话,我宁愿把所有这些事情都隐藏起来。嗨,侯赛因,我也一直在尝试着做同样的事情,我们可以为你找到解决办法。提前谢谢!!!@普拉文·潘迪:不,很不幸。
String cmd ="-i '"+ tmpVideoPath+"' -filter:v "+"'crop="+view.getWidth()+":"+view.getHeight()+":"+view.getX()+":"+view.getY()+"'"+" -c:a copy "+outVideoPath
FFmpeg ffmpeg = FFmpeg.getInstance(context);
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {}
@Override
public void onProgress(String message) {}
@Override
public void onFailure(String message) {}
@Override
public void onSuccess(String message) {}
@Override
public void onFinish() {}
});