像whatsapp一样修剪视频

Posted

技术标签:

【中文标题】像whatsapp一样修剪视频【英文标题】:Trim video Like whatsapp 【发布时间】:2014-04-07 00:00:18 【问题描述】:

我在 whatsapp messenger 中看到了独特的功能。其中在发送视频应用程序之前允许用户选择帧,并且用户只能将那些选定的帧作为视频发送。

所以,我的问题是我们如何将视频划分为帧并再次从划分的帧中生成视频? whatsapp 消息是怎么做的?

【问题讨论】:

你有什么解决办法或例子吗? 嘿,开发者,你有这个问题的解决方案吗?我有同样的任务,请帮助我。 嘿,你有没有什么图书馆或其他东西来实现这个目标? @dev ..你有什么解决办法吗??? @BMM 看看这个github.com/a914-gowtham/android-video-trimmer 我已经在 android 10 上支持 【参考方案1】:

您可以使用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
    

在剪切视频之前,您必须通过在onCreate()onCreateView( 中调用以下方法来加载FFMPEG。最好在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,允许用户使用 anothem/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 具有适用于 Android 的高级库。但是 - (1)你能举个例子如何用它裁剪视频吗? (2) 它的许可证是 GPL,这意味着您必须为每次安装应用程序付费。 @Nativ 无需为每次安装应用程序付费。请查看我的答案中的更新 这是修剪,但用户要求裁剪 @BhuvneshVarma,关于如何通过 ffmpeg 传递所选视频的四个角坐标并进行裁剪有什么建议吗? @Smogen FFMpeg 现在也可以使用..该错误仅出现在 x86 设备中。您可以使用this 来修复它..【参考方案2】:

我认为,正如其他人所建议的那样使用 ffmpeg,它有一个非常严格的许可证,这要求你的应用程序也必须是开源的并拥有它的许可证,我记得。

如果您愿意,可以使用我制作的 VideoTrimmer 库,它基于其他许可库。

【讨论】:

【参考方案3】:

https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html

how to use ffmpeg on android

阅读有关“ffmpeg.c”中静态变量的问题...

我敢打赌,你有同样的问题,需要做一些事情(3 个替代选择)来重置或 GC 那些变量:

    获取加载 lib 的 java 类加载器并对其进行 GC

    在 c 层执行 OP 在上述链接中所做的操作

    编写第二个共享库,在每个调用周期中在第一个库上使用“dlsym”和“dlclose”

github,请参阅“自述文件”here

【讨论】:

您好 navin,感谢您的回复。你给出的解决方案是针对andorid的? 是的。您必须将库包含到您的应用程序中,然后才能裁剪视频 您能给我提供示例或代码,我该如何实现?【参考方案4】:

使用Android-video-trimmer android library。它使用 FFmpeg 和 exoplpayer。它使视频修剪更容易

【讨论】:

我已尝试使用您的库,但失败并显示“无法修剪”吐司 使用最新的github.com/a914-gowtham/Android-video-trimmer 现在支持android 10

以上是关于像whatsapp一样修剪视频的主要内容,如果未能解决你的问题,请参考以下文章

像whatsapp一样加载联系人

如何像whatsapp一样将图像缓存到特定文件夹

如何像在 whatsapp 中一样在 CollapsingToolbarLayout 中实现字幕

如何像 SwiftUI 中的 WhatsApp 一样在滑动时关闭键盘

像在 WhatsApp 中一样加载多个图像进度条

是否可以像 Whatsapp messenger 一样使用预填充文本输入字段的文本创建指向用户的链接?