我在 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
}
}
在剪辑视频之前,您需要调用下面的方法加载FFMPEG,可以在onCreate()
或onCreateView()
中执行此方法。最好将此方法放在AsyncTask中执行。
在剪切视频之前,您需要通过调用下面的方法加载FFMPEG,可以在onCreate()
或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) {
}
}
您还可以使用anothem/android-range-seek-bar库创建一个RangeSeekbar,以允许用户从原始视频中选择裁剪视频的时间范围。
更新
下面的链接包含我在博客上撰写的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
https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html
阅读有关“ffmpeg.c”中静态变量问题的内容...
我敢打赌你也遇到了同样的问题,需要做一些事情(3个备选方案)来重置或GC这些变量:
获取加载库的Java类加载器并进行GC
在C层中执行上面链接中OP所做的操作
编写第二个共享库,在每个调用周期中使用'dlsym'和'dlclose'对第一个库进行操作
请查看GitHub上的“README”此处
使用Android-video-trimmer Android 库。它使用 ExoPlayer 和 FFmpeg,使得视频剪辑更加容易。