Git Product home page Git Product logo

iknow4 / android-video-trimmer Goto Github PK

View Code? Open in Web Editor NEW
1.1K 38.0 262.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

  • 👋 Hi, I’m @iknow4
  • 🗼 Living in Singapore.
  • 👨‍💻 Currently Working in the crypto financial industry.
  • 👍 Beer and Gaming 🍻 🎮

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的视频帧就显示不出来了,整体感觉卡顿卡顿的。

ffmpeg

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

裁剪框不能拖到最后

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

视频合成

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

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

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

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)

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?

滑动的时候有Bug

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

Missing Classes

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

闪退

点击一个视频进入出现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)

我这面执行为什么走 失败方法 并且告诉我 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) 

setMaxDuration不是15秒就不对

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

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

需要精确裁剪的拿走不谢

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);
        }
    });

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.

点击完成闪退

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)

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)

视频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) 

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.

拖动的手柄有bug

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

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

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.

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

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

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

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.