Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过在android或java中捕获动画视图来制作视频文件?_Java_Android_Video Capture - Fatal编程技术网

如何通过在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() {}

});