我在whatsapp messenger中看到了独特的功能。其中在发送视频应用程序之前允许用户选择帧,并且用户只能将那些选定的帧作为视频发送。
所以,我的问题是我们如何将视频划分为帧并再次从划分的帧中生成视频?whatsapp 消息是如何完成的?
我在whatsapp messenger中看到了独特的功能。其中在发送视频应用程序之前允许用户选择帧,并且用户只能将那些选定的帧作为视频发送。
所以,我的问题是我们如何将视频划分为帧并再次从划分的帧中生成视频?whatsapp 消息是如何完成的?
您可以使用ffmpeg-android来剪切/裁剪视频。使用它添加
compile 'com.github.hiteshsondhi88.libffmpeg:FFmpegAndroid:0.2.5'
到依赖。
要剪切视频,请运行此命令
 execFFmpegCommand("-i " + path.getAbsolutePath() + " -ss " + startMs / 1000 + " -to " + endMs / 1000 + " -strict -2 -async 1 " + dest.getAbsolutePath());
path原始视频的路径在哪里 
。
startMs是您要剪切的视频形式的初始时间(裁剪视频的开始时间)
endMs是您要剪切的视频的时间(裁剪视频的结束时间)
dest是您要保存剪切/裁剪视频的路径
如果您的文件名或文件夹名包含空格,请使用字符串格式化程序来处理空格。
private void execFFmpegCommand(final String command) {
    try {
        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {
                Log.e("FFMPEG", "FAILED with output : " + s);
            }
            @Override
            public void onSuccess(String s) {
                Log.e("FFMPEG", "SUCCESS with output : " + s);
            }
            @Override
            public void onProgress(String s) {
                Log.e("FFMPEG", "Started command : ffmpeg " + command);
                Log.e("FFMPEG", "progress : " + s);
            }
            @Override
            public void onStart() {
                Log.e("FFMPEG", "Started command : ffmpeg " + command);
            }
            @Override
            public void onFinish() {
                Log.e("FFMPEG", "Finished command : ffmpeg " + command);
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // do nothing for now
    }
}
在剪切视频之前,您必须通过调用下面的方法来加载 FFMPEGonCreate()或onCreateView()。最好在 AsyncTask 中执行此方法。
private void loadFFMpegBinary() {
        try {
            if (ffmpeg == null) {
                ffmpeg = FFmpeg.getInstance(getActivity());
            }
            ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
                @Override
                public void onFailure() {
                }
                @Override
                public void onSuccess() {
                    Log.e("FFMPEG", "ffmpeg : correct Loaded");
                }
            });
        } catch (FFmpegNotSupportedException e) {
        } catch (Exception e) {
        }
    }
您还可以制作 RangeSeekbar 以允许用户使用anthem/android-range-seek-bar库从原始视频中选择裁剪视频的时间范围。
更新
下面的链接包含我在博客上写的 ffmpeg 视频编辑器教程,其中包括如何使用 FFmpeg 库剪切视频-
https://androidlearnersite.wordpress.com/2017/03/17/ffmpeg-video-editor/
下面的链接包含该教程的完整源代码 -
https://github.com/bhuvnesh123/FFmpeg-Video-Editor-Android
以下是在该教程中创建的应用程序的 Playstore 链接-
https://play.google.com/store/apps/details?id=videoeditor.bhuvnesh.com.ffmpegvideoeditor
我认为,正如其他人所建议的那样使用 ffmpeg,它有一个非常严格的许可证,要求你的应用程序也是开源的并拥有它的许可证,我记得。
如果您愿意,可以使用我制作的VideoTrimmer库,它基于其他许可库。
https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html
阅读有关“ffmpeg.c”中静态变量的问题...
我敢打赌你有同样的问题,需要做一些事情(3个替代选择)来重置或GC这些变量:
获取加载 lib 的 java 类加载器并对其进行 GC
在 c 层中执行 OP 在上述链接中所做的操作
在每个调用周期中,在第一个库上编写一个使用“dlsym”和“dlclose”的第二个共享库
github,请参阅此处的“自述文件”
使用Android-video- trimmer android library.it 使用 FFmpeg 和 exoplpayer.it 使视频修剪更容易