Coder Social home page Coder Social logo

iknow4 / android-video-trimmer Goto Github PK

View Code? Open in Web Editor NEW
1.1K 38.0 261.0 319 KB

Android-Video-Trimmer项目实现了对长短视频进行片段的裁剪选择。使用MediaMetadataRetriever获取视频帧,采用ffmpeg进行视频裁剪,和视频压缩。

License: Apache License 2.0

Java 100.00%
video trimmer android trimming video-trimmer android-video-editor ffmpeg ffmpeg-android ffmpeg-android-java ffmpeg-command

android-video-trimmer's Introduction

项目介绍

实现Android上使用ffmpeg进行视频裁剪,压缩功能。类似视频裁剪功能的开源项目,个人觉得非常稀缺。 不像ios开源的那么多,自己在开发过程中也是不断的摸索,其中也遇到不少蛋疼的问题。 现在简单说一下这个项目实现。

使用到相关技术

  • FFmpeg实现裁剪视频
  • FFmpeg实现裁剪之后的视频压缩
  • 采用Loader或者ContentProvider获取所有视频资源
  • 采用VideoView播放视频
  • 采用RecycleView显示视频的帧图片
  • 通过MediaMetadataRetriever获取视频帧的Bitmap
  • View的自定义

功能扩展思考

视频裁剪功能之后往往涉及到视频的压缩和上传,每一个功能都是Android开发中的高阶内容,比如说视频的压缩,压缩库其实开源的有一些, 但是能达到压缩比高、压缩速度快,同时又保证视频的质量,这样的开源库还是比较少的。 在这个项目中,我只是简单的实现了裁剪后的视频压缩,想达到一个好的压缩效果,还需要在项目中对视频压缩参数进行调整, 大家可以fork项目进行相应的移植和修改。

其他

  • 视频裁剪完成,会将裁剪好的视频输出保存至应用的Android->data->包名->cache文件夹中
  • 联系方式 Email: [email protected] WeChat: 516799851

欢迎star、fork和issues.

License

See the LICENSE file.

项目重构后的视频截图

videoTrim2

项目重构前的视频截图

VideoTrim

Maintainers

Contributors

Original Author: iknow4

android-video-trimmer's People

Contributors

ddthanh198dev avatar dpproduction avatar iknow4 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-video-trimmer's Issues

有些许问题

先膜拜下大神。 再提点小问题。
at com.iknow.android.widget.RangeSeekBarView.onDraw(RangeSeekBarView.java:156),这里划着划着就oom了。有的手机大于30S的视频帧就显示不出来了,整体感觉卡顿卡顿的。

bitmap 为空

09-04 00:03:06.031 4960-4960/com.iknow.android E/Minikin: addFont failed to create font data/skin/fonts/DroidSansChinese.ttf 09-04 00:03:09.162 4960-5015/com.iknow.android E/MediaMetadataRetrieverJNI: getFrameAtTime: videoFrame is a NULL pointer 09-04 00:03:09.163 4960-5015/com.iknow.android E/AndroidRuntime: FATAL EXCEPTION: pool-2-thread-1 Process: com.iknow.android, PID: 4960 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:591) at com.iknow.android.utils.TrimVideoUtil$2.execute(TrimVideoUtil.java:106) at iknow.android.utils.thread.BackgroundExecutor$Task.run(BackgroundExecutor.java:212) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818)

视频合成

老铁,能做一个视频合成,加水印的demo吗?
谢谢

闪退

点击一个视频进入出现OOM:
AndroidRuntime: FATAL EXCEPTION: main
Process: com.iknow.android, PID: 2743
java.lang.OutOfMemoryError: Failed to allocate a 1054452 byte allocation with 393640 free bytes and 384KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:1070)
at android.graphics.Bitmap.createBitmap(Bitmap.java:1040)
at android.graphics.Bitmap.createBitmap(Bitmap.java:944)
at com.iknow.android.widget.RangeSeekBarView.onDraw(RangeSeekBarView.java:156)
at android.view.View.draw(View.java:17250)
at android.view.View.updateDisplayListIfDirty(View.java:16215)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.draw(View.java:17253)
at android.view.View.updateDisplayListIfDirty(View.java:16215)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)
at android.view.View.draw(View.java:17016)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16210)

Reset

I have implemented your code, It works great. But I need to refresh all the component once I changed the video. Here I changed VideoTrimmerview, recycle Adapter but cant refreshing RangeSeekBarView. Please help us.

我这面执行为什么走 失败方法 并且告诉我 FFmpeg: Exception while trying to run: [/data/user/0/cn.wdcloud.luke/files/ffmpeg, -ss, 00:00, -t, 00:00:05, -accurate_seek, -i, /storage/emulated/0/Android/data/cn.wdcloud.luke/files/Video/2019-05-16-15-12-54.mp4, -codec, copy, -avoid_negative_ts, 1, /storage/emulated/0/Android/data/cn.wdcloud.luke/files/Video/trim_2019-05-16-15-13-13.mp4] java.io.IOException: Cannot run program "/data/user/0/项目名称/files/ffmpeg": error=2, No such file or directory

FFmpeg: Exception while trying to run: [/data/user/0/项目名称//files/ffmpeg, -ss, 00:00, -t, 00:00:05, -accurate_seek, -i, /storage/emulated/0/Android/data/项目名称/files/Video/2019-05-16-15-12-54.mp4, -codec, copy, -avoid_negative_ts, 1, /storage/emulated/0/Android/data/项目名称//files/Video/trim_2019-05-16-15-13-13.mp4]
java.io.IOException: Cannot run program "/data/user/0项目名称//files/ffmpeg": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:983)
at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.java:15)
at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.java:43)
at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.java:12)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:133)
at java.lang.ProcessImpl.start(ProcessImpl.java:128)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:964)
at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.java:15) 
at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.java:43) 
at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.java:12) 
at android.os.AsyncTask$2.call(AsyncTask.java:304) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
at java.lang.Thread.run(Thread.java:762) 

Missing Classes

Your project is missing some classes like : iknow.android.utils.DeviceUtil | UnitConverter | SimpleCallback | SingleCallback ...

滑动的时候有Bug

测试一个 02:47的视频,先拖到图片最后面,再拖到最前面,最前只能到00:29就不能再往前了,实际显示图片倒是00:00的。这个Bug还请麻烦看看哈

需要精确裁剪的拿走不谢

double startTime = (double)startMs / 10.0D / 10.0D / 10.0D;
double induration = (double)(endMs - startMs) / 10.0D / 10.0D / 10.0D;
String[] complexCommand = new String[]{"ffmpeg", "-ss", "" + startTime, "-y", "-i", inputFile, "-t", "" + induration, "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputFile};
FFmpegCmd.exec(complexCommand, 0L, new OnEditorListener() {
public void onSuccess() {
callback.onFinishTrim(outputFile);
}

        public void onFailure() {
            callback.onFailed();
        }

        public void onProgress(float progress) {
            Log.d(TrimVideoUtil.TAG, "FAILED with onProgress : " + progress);
        }
    });

裁剪框不能拖到最后

例如一个视频有22秒,只能选择裁剪前面19s的内容,最后几秒裁剪框不能拖动到那里

视频372M 时长三分半 加载的时候就ANR了 ,请问这个怎么解决

05-28 12:02:20.548 E/AndroidRuntime: FATAL EXCEPTION: main
Process: cn.carya, PID: 17304
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 882064 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4022)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Caused by: android.os.TransactionTooLargeException: data parcel size 882064 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:751)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4670)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4014)
at android.os.Handler.handleCallback(Handler.java:789) 
at android.os.Handler.dispatchMessage(Handler.java:98) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6642) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778) 

将时间精确到0.1秒为单位的裁剪

如果我将时间改为每次裁剪区域时间为60秒
裁剪时间精确到毫秒的话
发现拖动右边进度条的准确有问题
不是很清楚这块的算法

image
迫不得已自己加了没有完美的减去了一定的宽度,精确度提高了解决了我的问题 不过不知道是哪里造成的误差 左边的没有这个问题

设置好视频地址,跳转到裁剪页面,报错,项目下载下来,首页也获取不到视频啊,求解

FATAL EXCEPTION: pool-1-thread-1
Process: com.iknow.android, PID: 18115
java.lang.IllegalArgumentException
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:71)
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:157)
at com.iknow.android.utils.TrimVideoUtil$2.execute(TrimVideoUtil.java:100)
at iknow.android.utils.thread.BackgroundExecutor$Task.run(BackgroundExecutor.java:212)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)

crash on launch when using in my app

` Process: testing.com.vidtrimporttest, PID: 25187
java.lang.ExceptionInInitializerError
at testing.com.vidtrimporttest.trimmerlib.utils.TrimVideoUtil.getAllVideoFiles(TrimVideoUtil.java)
at testing.com.vidtrimporttest.trimmerlib.VideoSelectActivity.onCreate(VideoSelectActivity.java:35)

`

FULL LOG : https://hastebin.com/kufenagito.sql

I added your files (xml / gradle stuff / classes) to my project and it builds but on launch (first activity is the .trimmerlib.VideoSelectActivity)

i didn't change anything else than imports to make them work in my project.

Trimming process never succeeds

I just downloaded your project and trimmed a video.

Looks like the process never succeeds, the alert dialog never hides.

By the way, the UI for trimming looks really cool

拖动的手柄有bug

具体描述:
当视频的截图的listview长度小于屏幕的宽度的时候,按住右边的手柄,先小范围的滑动,然后猛的往右滑就会滑出listview的范围!

我截图,但是晓得怎么上传!

点击完成闪退

FATAL EXCEPTION: main
Process: com.iknow.android, PID: 6953
java.lang.RuntimeException: Only one Looper may be created per thread
at android.os.Looper.prepare(Looper.java:88)
at android.os.Looper.prepare(Looper.java:83)
at com.iknow.android.TrimmerActivity.onFinishTrim(TrimmerActivity.java:79)
at com.iknow.android.utils.TrimVideoUtil$1.onSuccess(TrimVideoUtil.java:61)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.onPostExecute(FFmpegExecuteAsyncTask.java:68)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.onPostExecute(FFmpegExecuteAsyncTask.java:10)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

ffmpeg

项目中用到的ffmpeg库好像有几年没更新了,请问这样ok吗?

setMaxDuration不是15秒就不对

抱歉 回复晚了。
问题已经修复,现在视频裁剪的时间,由TrimVideoUtil.java类中的变量VIDEO_MAX_DURATION来统一控制。

请更新最新代码。
非常感谢!

MediaMetadataRetrieverJNI: getFrameAtTime: videoFrame is a NULL pointer

E/MediaMetadataRetrieverJNI: getFrameAtTime: videoFrame is a NULL pointer

I recorded a video in SamsungS7 edge back camera, I have integrated Camera-2-API in my project, I try to trim video at this moment this crash will happen, I maintain resolution for recording is 1920x1080 resolution.
Here is my log.

I/System.out: SCREEN_WIDTH_FULL:1440
I/System.out: RECYCLER_VIEW_PADDING:140
I/System.out: VIDEO_FRAMES_WIDTH:1160
I/System.out: THUMB_WIDTH:116
I/System.out: THUMB_HEIGHT:200
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
W/System.err:     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:733)
W/System.err:     at com.ibot.cyranoapp.utils.VideoTrim.TrimVideoUtil$2.execute(Unknown Source:173)
W/System.err:     at com.ibot.cyranoapp.activity.videotrimmer.BackgroundExecutor$Task.run(Unknown Source:19)
W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err:     at java.lang.Thread.run(Thread.java:764)

Please help to resolve this issue. Thanks in advance.

How to use in my own project?

How can I use your stuff with the editor in my project?

So call your Select video activity and return a output uri?

I tried import porject but I don't see a way to start your activity or similiar , how do you do what I want to do?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.