tourenathan-g5organisation / silicompressor Goto Github PK
View Code? Open in Web Editor NEWA powerful, flexible and easy to use Video and Image compression library for Android.
License: Apache License 2.0
A powerful, flexible and easy to use Video and Image compression library for Android.
License: Apache License 2.0
After shooting a video in my phone's camera the compression process outputs a file which is not progressive download ready.
The outcome is that video file can only be played after it was fully downloaded.
I compress video using SiliCompressor, which works fine in android except for android 8.0.
when I use android 8.0 to compress a video, the compressed video can be play by VideoView in android 7.0 and 8.0, but not work in android 5.0 or iPhone, Mac QuickTime player.
sometime the video is all green at the beginning of a few seconds, sometime it just all black.
I test on many phone, result in all android8.0 phone meet this issue.
can somebody help?
This library is based on VideoCompressor by lalongooo which in turn is based on Telegram. So this library should include the GNU license as well.
Here is my code:
`public class MainActivity extends AppCompatActivity {
private static final String TAG = "Video Compressor";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File sourcePath = new File("/storage/emulated/0/Video/sample.MP4");
Log.d(TAG, "onClick: sourcepath==== " +sourcePath);
Uri sourceURI = Uri.fromFile(sourcePath);
File desPath = new File("/storage/emulated/0/","");
Uri desURI = Uri.fromFile(desPath);
try {
String path = SiliCompressor.with(getApplicationContext()).compressVideo(sourceURI.toString(), desURI.toString());
Log.d(TAG, "onClick: gfsdgfsg=== "+ Uri.parse(path.substring(5)));
File file = new File(path.substring(5));
FileOutputStream fos = new FileOutputStream(file);
fos.flush();
fos.close();
float length = file.length() / 1024f; // Size in KB
String value;
if(length >= 1024)
value = length/1024f+" MB";
else
value = length+" KB";
Log.i("Silicompressor", "Path: "+value);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}`
Here is the log:
08-03 15:19:21.575 5653-5653/com.solo.vinay.videocompression D/Video Compressor: onClick: sourcepath==== /storage/emulated/0/Video/sample.MP4 08-03 15:19:21.615 5653-5653/com.solo.vinay.videocompression W/HTCLOG: use specified tag [MediaMetadataRetriever], func [0]. 08-03 15:19:21.615 5653-5653/com.solo.vinay.videocompression W/HTCLOG: mask=0x18 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression E/tmessages: file:/storage/emulated/0/VIDEO_20170803_151921.mp4: open failed: ENOENT (No such file or directory) 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression E/tmessages: time = 29 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression E/ViratPath: /storage/emulated/0/Video/sample.MP4 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression E/ViratPath: file:/storage/emulated/0/VIDEO_20170803_151921.mp4 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression E/ViratPath: /storage/emulated/0/Video/sample.MP4 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression V/SiliCompressor: Video Conversion Complete 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression D/Video Compressor: onClick: gfsdgfsg=== /storage/emulated/0/VIDEO_20170803_151921.mp4 08-03 15:19:21.685 5653-5653/com.solo.vinay.videocompression I/Silicompressor: Path: 0.0 KB
create a thread and return with the result in the callback so you do not have to do this at hand
I am passing correct Source and Destination URI String in Compressing video function, still I am getting IllegalArgumentException. Please Help.
filePath = SiliCompressor.with((ActCreateVideo.this)).compressVideo(recordedVideoURI.getPath(), compressedVideoURI.getPath());
Here URIs are defined as:
recordedVideoURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider",recordedFileWithinMyDir);
compressedVideoURI = Uri.parse("content://xyz/external_files/" + folder_main +File.separator+ "VID_COMPRESSED_" + timeStamp + ".mp4");
Error Log:
Caused by: java.lang.IllegalArgumentException
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:64)
at com.iceteck.silicompressorr.videocompression.MediaController.convertVideo(MediaController.java:252)
at com.iceteck.silicompressorr.SiliCompressor.compressVideo(SiliCompressor.java:300)
at com.igb.ActCreateVideo.onActivityResult(ActCreateVideo.java:128)
at android.app.Activity.dispatchActivityResult(Activity.java:6931)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4090)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4137)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Hi,
Thanks for your lib. It works fine.
However, I'd like to understand how we can change defaults compression settings...
The result quality is not very good, and I'd like to change it.
Thanks !
EDIT :
It seems these settings are hard-coded in MediaController.java file. Do you confirm ?
Hello Tourenathan, is there a way to compress a bitmap directly ? give the bitmap through the constructor not an image URI ? thank you.
Android N doesn't support reading from scheme file://. It uses content://
Refer : https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en
While running the silicompressor with suggested approach of above link, it gives following exception:
Seems silicompressor is failing to read with this new scheme.
Hi,
I loved it before. but now, silicompressor is not supportting on Android N.
Specially Samsung S8. Please confirm it and update,
Regards,
Getting dex error
Hi Nate,
in MediaController line 305 : rotationValue = 0;
should be rotationValue = 90;
otherwise the compressed file is on it's side.
I write this code but getting error :
class VideoCompressAsyncTask extends AsyncTask<String, String, String> {
Context mContext;
public VideoCompressAsyncTask(Context context){
mContext = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... paths) {
String filePath = null;
try {
sourceUriString = "/storage/emulated/0/DCIM/Camera/A.mp4";
String destinationUriString = "/storage/emulated/0/videokit";
filePath = SiliCompressor.with(mContext).compressVideo(sourceUriString, destinationUriString);
Log.d(MainActivity.class.getName() , "filePath : "+filePath);
} catch (URISyntaxException e) {
e.printStackTrace();
}
return filePath;
}
@Override
protected void onPostExecute(String compressedFilePath) {
super.onPostExecute(compressedFilePath);
File imageFile = new File(compressedFilePath);
float length = imageFile.length() / 1024f; // Size in KB
String value;
if(length >= 1024)
value = length/1024f+" MB";
else
value = length+" KB";
Log.i("Silicompressor", "Path: "+value);
}
}
calling from onCreate()
{
String sourceUriString = "/storage/emulated/0/DCIM/Camera/A.mp4";
String destinationUriString = "/sdcard/videokit/new_compress.mp4";
File f = new File(Environment.getExternalStorageDirectory() + "/videokit/C.mp4");
Log.d(MainActivity.class.getName() , "getName:"+f.getName());
Log.d(MainActivity.class.getName() , "path:"+f.getPath());
File f1 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/videokit");
new VideoCompressAsyncTask(this).execute(f.getPath().toString(), f1.getPath().toString());
}
FATAL EXCEPTION: AsyncTask #1
Process: com.silicompressorapplication, PID: 3103
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
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:841)
Caused by: java.lang.IllegalArgumentException
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:63)
at com.iceteck.silicompressorr.videocompression.MediaController.convertVideo(MediaController.java:252)
at com.iceteck.silicompressorr.SiliCompressor.compressVideo(SiliCompressor.java:300)
at com.silicompressorapplication.MainActivity$VideoCompressAsyncTask.doInBackground(MainActivity.java:51)
at com.silicompressorapplication.MainActivity$VideoCompressAsyncTask.doInBackground(MainActivity.java:32)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
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:841)
Hello,
the compressor is great i must admit it's one of the best i used so far, i have a small issue, when i use the getcompressbitmap it returns the bitmap but it doesn't delete the picture inside the silicomfolder on SD how to do that without having the get the image path then transform it to bitmap then delete programmatically as it takes more useless steps (just for performance tuning)
Hi, thanks for you open source, It help me a lot; but I have a little confuse:
1 : this library minSdkVersion should be 16 ? I see you set 15.
2: in MediaController.java file,there have a native method:
public native static int convertVideoFrame(ByteBuffer src, ByteBuffer dest, int destFormat, int width, int height, int padding, int swap);
where is it implements ?
In our project I need way to show video conversion progress. Is there any way to do this?
first of all thanks for your library you saved me a lot .
I'm using samsung grand prime+
recorded video through device camera in portrait with resolution as 1280x720
the video actually is 1280x720 with rotation 90
after the conversion the video flipped horizontally
i passed the real width and height of the video and just lowered the bitrate to 1600k
any help to just compress the video without flipping it?
i tested on some devices and seems to be ok just on some other devices like i listed above i have this issue
thanks in advance
Hi,
the project works good but I'm wondering if there is a way to compress the video and keep the voice too.
Thank you
Can I stop/cancel the compression process? Suppose that I have a large file to be processed, and the user don't want to wait for it, so he click the Cancel button.
With default option, the compression result is poor that it doesn't fulfill my need. Kindly assist if there is any parameter to tweak to achieve some better quality of compression.
I am doing simple compression via this library but it gives me error of java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:438)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:137)
at com.iceteck.silicompressorr.SiliCompressor.getRealPathFromURI(SiliCompressor.java:411)
at com.iceteck.silicompressorr.SiliCompressor.compressImage(SiliCompressor.java:174)
at com.iceteck.silicompressorr.SiliCompressor.compress(SiliCompressor.java:65)
at com.boysjoys.com.pro_working1.User_Chat_Functionality.ImageCompression.doInBackground(ImageCompression.java:50)
at com.boysjoys.com.pro_working1.User_Chat_Functionality.ImageCompression.doInBackground(ImageCompression.java:30)
Path URI content://com.android.providers.media.documents/document/image%3A2304
My Code
Log.d(TAG,"Path URI "+pathUri); String PathToStore=Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+"myApp"+"/media/images"; String storedFile= SiliCompressor.with(context).compress(pathUri.toString(),new File(PathToStore));
I cant find the result of the compression.
The path in the logcat show:
/storage/emulated/0/com.iceteck.silicompressor/media/videos/VIDEO_20171004_182622.mp4
but the path doesn't exist on phone after compression.
Hi
I am using this library for video compression. the output quality is low of compressed video. I am getting some fadded lines over video which shows video is compressed. I want to overcome this. I saw some hardcorde stuff in media controller.Tried by changing bitrate and frame rate but nothing seems to have impact. Can you please let me know which parameters i have to change to get high quality video?.
Warning:com.googlecode.mp4parser.authoring.tracks.mjpeg.OneJpegPerIframe: can't find referenced class javax.imageio.ImageIO
Warning:com.googlecode.mp4parser.authoring.tracks.mjpeg.OneJpegPerIframe: can't find referenced class java.awt.image.BufferedImage
Warning:there were 6 unresolved references to classes or interfaces.
Warning:Exception while processing task java.io.IOException: Please correct the above warnings first.
Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
Job failed, see logs for details
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.iceteck.silicompressorr.videocompression.MediaController.convertVideoFrame:(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIIII)I
and one more thing, what is the minimum sdk version to use this library.
I tried to pick video from gallery and compressing it using this in 2 devices yet so far ( LG Nexus 5 & Samsung Galaxy Grand - GT-I9082 ).
It worked fine in LG Nexus 5, but failed in "Samsung Galaxy Grand", without even mentioning the error.
For that, I debugged and placed logs in MediaController class (com.iceteck.silicompressorr.videocompression.MediaController)
Thus able to track the error
Please suggest any fix or workaround for that, in order to make it work on all devices
The error I got is as follows -
> java.lang.IllegalStateException
> at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
> at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1033)
> at com.iceteck.silicompressorr.videocompression.MediaController.convertVideo(MediaController.java:491)
> at com.iceteck.silicompressorr.SiliCompressor.compressVideo(SiliCompressor.java:300)
> at com.iceteck.silicompressor.SelectPictureActivity$VideoCompressAsyncTask.doInBackground(SelectPictureActivity.java:379)
> at com.iceteck.silicompressor.SelectPictureActivity$VideoCompressAsyncTask.doInBackground(SelectPictureActivity.java:358)
> at android.os.AsyncTask$2.call(AsyncTask.java:288)
> at java.util.concurrent.FutureTask.run(FutureTask.java:237)
> at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
> 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)
>
10-06 00:33:57.306 21238-21384/? E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 6 columns.
10-06 00:33:57.309 21238-21384/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.pawan.compressor, PID: 21238
Theme: themes:{default=overlay:com.cyngn.hexo, iconPack:com.cyngn.hexo, fontPkg:com.cyngn.hexo, com.android.systemui=overlay:com.cyngn.hexo, com.android.systemui.navbar=overlay:com.cyngn.hexo}
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:438)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:137)
at com.iceteck.silicompressorr.SiliCompressor.getRealPathFromURI(SiliCompressor.java:322)
at com.iceteck.silicompressorr.SiliCompressor.compressImage(SiliCompressor.java:163)
at com.iceteck.silicompressorr.SiliCompressor.compress(SiliCompressor.java:59)
at com.example.pawan.compressor.MainActivity$ImageCompressionAsyncTask.doInBackground(MainActivity.java:101)
at com.example.pawan.compressor.MainActivity$ImageCompressionAsyncTask.doInBackground(MainActivity.java:90)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Thx for this awesome library, was used together with asynctask and it work great.
But now i want to it to compress on background even when user kill the app.
Do you have any idea?
when i use it in service, my app become not responding.
I tried this code for compressing gallery video ---
private void galleryIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("video/mp4");
try {
capturedUri = Uri.fromFile(createMediaFile(TYPE_VIDEO));
} catch (IOException e) {
e.printStackTrace();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, capturedUri);
Log.d(LOG_TAG, "VideoUri: " + capturedUri.toString());
startActivityForResult(intent, RESQUEST_TAKE_VIDEO);
}
// Method which will process the captured image
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//verify if the image was gotten successfully
if (requestCode == RESQUEST_TAKE_VIDEO && resultCode == RESULT_OK){
if (data.getData() != null) {
//create destination directory
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getPackageName() + "/media/videos");
if (f.mkdirs() || f.isDirectory())
//compress and output new video specs
new VideoCompressAsyncTask(this).execute(data.getData().toString(), f.getPath());
}
}
}
private File createMediaFile(int type) throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String fileName = type == 1 ? "JPEG_" + timeStamp + "_" : "VID_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
type == 1 ? Environment.DIRECTORY_PICTURES : Environment.DIRECTORY_MOVIES);
File file = File.createTempFile(
fileName, /* prefix */
type == 1 ? ".jpg" : ".mp4", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + file.getAbsolutePath();
Log.d(LOG_TAG, "mCurrentPhotoPath: " + mCurrentPhotoPath);
return file;
}
But, its not working, getting failed. What I am doing wrong here?
bitmap = SiliCompressor.with(this).getCompressBitmap(imageUri.toString());
Hi, I'm trying to save compressed video to Firebase Storage, but I'm getting error No content provider.
I'm getting sourceUri from data.getData and destinationUri is: mStorageReference = FirebaseStorage.getInstance().getReference().child("VideoFile");
Do you have any suggestion, where I'm making mistake? Thank you for any help.
` @OverRide
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_PICK_VIDEO && resultCode == RESULT_OK && data != null) {
Uri filepath = data.getData();
final String name = "VIDEO" + filepath.getLastPathSegment().toString() + ".mp4";
StorageReference videoRef = mStorageReference.child(name);
String compressPath = null;
try {
compressPath = SiliCompressor.with(getApplicationContext()).compressVideo(filepath.toString(), String.valueOf(mStorageReference));
} catch (URISyntaxException e) {
e.printStackTrace();
}
videoRef.putFile(Uri.parse(compressPath)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadedUrl = taskSnapshot.getDownloadUrl();
String url = downloadedUrl.toString();
getDownloadedUrl(downloadedUrl);
uploadToDatabase(name, url, databaseReferenceString);
}
`
and here is my logcat:
08-20 18:56:53.148 8388-8551/com.example.admin.databaseproject E/StorageException: StorageException has occurred. An unknown error occurred, please check the HTTP result code and inner exception for server response. Code: -13000 HttpResult: 0
08-20 18:56:53.148 8388-8551/com.example.admin.databaseproject E/StorageException: No content provider: gs:/firechat-99dd1.appspot.com/VideoFile/VIDEOvideo%3A26296.mp4/VIDEO_20170820_185653.mp4 java.io.FileNotFoundException: No content provider: gs:/firechat-99dd1.appspot.com/VideoFile/VIDEOvideo%3A26296.mp4/VIDEO_20170820_185653.mp4 at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1066) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:921) at android.content.ContentResolver.openInputStream(ContentResolver.java:646) at com.google.firebase.storage.UploadTask.<init>(Unknown Source) at com.google.firebase.storage.StorageReference.putFile(Unknown Source) at com.example.admin.databaseproject.MainActivity.onActivityResult(MainActivity.java:165) at android.app.Activity.dispatchActivityResult(Activity.java:6235) at android.app.ActivityThread.deliverResults(ActivityThread.java:3584) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3631) at android.app.ActivityThread.access$1300(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5268) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
Why not add this in build.gradle ?
compile 'com.googlecode.mp4parser:isoparser:1.1.20'
instead of using a static .jar library ?
Because this way you can quickly update your library isoparser
and if a user want use your SiliCompressor
can exlude in his build isoparser
if he is using in another library (so solve duplicate problem)
D/EGL_emulation: eglMakeCurrent: 0xa48206a0: ver 2 0
E/WVMExtractor: Failed to open libwvm.so: dlopen failed: library "libwvm.so" not found
E/tmessages: colorFormat = 2130708361
I/OMXClient: Using client-side OMX mux.
I/SoftAVCEncoder: Construct SoftAVCEncoder
W/ACodec: do not know color format 0x7f000789 = 2130708361
I/ACodec: setupVideoEncoder succeeded
W/ACodec: do not know color format 0x7f000789 = 2130708361
[ 12-27 17:32:49.192 1831: 2291 D/ ]
HostConnection::get() New Host Connection established 0xaf68b060, tid 2291
[ 12-27 17:32:49.192 1831: 2291 W/ ]
Unrecognized GLES max version string in extensions: ANDROID_EMU_CHECKSUM_HELPER_v1
D/EGL_emulation: eglCreateContext: 0xaf5271c0: maj 2 min 0 rcv 2
D/EGL_emulation: eglMakeCurrent: 0xaf5271c0: ver 2 0
E/SoftAVCEncoder: Video frame size 640x360 must be a multiple of 16
E/SoftAVCEncoder: Failed to initialized encoder params
E/ACodec: [OMX.google.h264.encoder] ERROR(0x80001001)
E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6
I/OMXClient: Using client-side OMX mux.
W/OMXNodeInstance: [1:google.h264.decoder] component does not support metadata mode; using fallback
E/ACodec: [OMX.google.h264.decoder] storeMetaDataInBuffers failed w/ err -1010
E/tmessages: println needs a message
E/tmessages: time = 114
E/ViratPath: /storage/sdcard/Download/Hichki - Official Trailer (HD 360p).mp4
E/ViratPath: /storage/sdcard/VIDEO_20171227_173249.mp4
E/ViratPath: /storage/sdcard/Download/Hichki - Official Trailer (HD 360p).mp4
V/SiliCompressor: Video Conversion Complete
New video is created but file size of new video is in bytes
Hi, I am compressing mp4 video in android, it is getting compressed but when I am trying to open it it says "Media type not supported". My purpose is to compress and upload it to server but when I am uploading it to server using multipart no video details are coming although I can play that video using VLC player.
Hi I'm getting java.lang.ArithmeticException: divide by zero while compressing image on Android 4.4.2, but works on other Android versions.
Unable to decode stream: java.io.FileNotFoundException: /storage/sdcard0/Pictures/Screenshots/Screenshot_2017-05-28-13-01-55.png: open failed: ENOENT (No such file or directory)
java.lang.ArithmeticException: divide by zero
at com.iceteck.silicompressorr.SiliCompressor.compressImage(SiliCompressor.java:191)
at com.iceteck.silicompressorr.SiliCompressor.getCompressBitmap(SiliCompressor.java:151)
at com.xxxxx.Activities.EditImageActivity.setupImage(EditImageActivity.java:150)
at com.xxxxx.Activities.EditImageActivity.onCreate(EditImageActivity.java:88)
at android.app.Activity.performCreate(Activity.java:5238)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
I am getting
"W/ExifInterface: Invalid image: ExifInterface got an unsupported image format file(ExifInterface supports JPEG and some RAW image formats only) or a corrupted JPEG file to ExifInterface"
on trying to compress png images
Please help
Right now we are using version : 1.0.6 and we use below for movie
Movie movie = MovieCreator.build((DataSource) randomAccessFile.getChannel());
I checked below gradle link has higher version.
compile 'com.googlecode.mp4parser:isoparser:1.1.20'
And big difference is this new version. In this we have below:
Movie movie = MovieCreator.build(new FileDataSourceViaHeapImp(src.getAbsolutePath()));
// NOTE: Switched to using FileDataSourceViaHeapImpl since it does not use memory mapping (VM).
// Otherwise we get OOM with large movie files.
I am getting below error when I pass
SiliCompressor.with(this).compressVideo("/storage/emulated/0/DCIM/Camera/VID_20170908_122018.mp4", "/storage/emulated/0/abc.mp4");
java.lang.IllegalArgumentException
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:64)
at com.iceteck.silicompressorr.videocompression.MediaController.convertVideo(MediaController.java:252)
at com.iceteck.silicompressorr.SiliCompressor.compressVideo(SiliCompressor.java:300)
at com.xxx.farwide.coreview.activity.s3filehandling.S3FileTransactionActivity$1.run(S3FileTransactionActivity.java:74)
at java.lang.Thread.run(Thread.java:764)
The SiliCompressor.java
is identical to the code provided by Ambalika Saha (http://voidcanvas.com/whatsapp-like-image-compression-in-android/) in her blog, at least you should give her due credit either in Readme or in the Source Code of that file.
Hi,
I'm getting a crash when trying to record video or catching photo.
Nexus 5X, Android 7.1.2
Here is the log
FATAL EXCEPTION: main
Process: com.iceteck.silicompressor, PID: 18436
android.os.FileUriExposedException: file:///storage/emulated/0/Movies/VID_20170913_133645_104748790.mp4 exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1796)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8941)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8926)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
at android.app.Activity.startActivityForResult(Activity.java:4228)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4186)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at com.iceteck.silicompressor.SelectPictureActivity.dispatchTakeVideoIntent(SelectPictureActivity.java:208)
at com.iceteck.silicompressor.SelectPictureActivity.requestPermissions(SelectPictureActivity.java:105)
at com.iceteck.silicompressor.SelectPictureActivity.access$000(SelectPictureActivity.java:34)
at com.iceteck.silicompressor.SelectPictureActivity$2.onClick(SelectPictureActivity.java:75)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/asd: open failed: ENOENT (No such file or directory)
https://stackoverflow.com/questions/36088699/error-open-failed-enoent-no-such-file-or-directory
in SelectPictureActivity add in line 152:
storageDir.mkdirs();
thanks.
I get successful compress video size 3MB from android. after upload, the video file to server this video is not playing. On my Cpanel file manager file size is 3 MB which is correct. If I open file location from browser URL, it shows blank browser play where total video time is correct on the player. But on click play button there is nothing. if I download the file from player download button than file size is 35KB only. if I download this video file from Cpanel using the download button on file manager then the file of size 3MB.
On the same directory, there is other .mp4 file playing correctly.
Here is file - http://blueappsoftware.in/VIDEO_20171003_113511.mp4
on cpanel file manager - file size is 3.98MB type is video/x-generic
Hello,
Is android:allowBackup="true" of any use in your library?
Otherwise I would say as filipmaelbrancke on:
medyo/android-about-page#6
Thanks !
Hi,
while building app after added silicompressor as a dependency I am getting error like:
...isoparser-1.0.6.jar: Invalid package reference in library; not included in Android: java.awt.image. Referenced from com.googlecode.mp4parser.authoring.tracks.mjpeg.OneJpegPerIframe.
...isoparser-1.0.6.jar: Invalid package reference in library; not included in Android: javax.imageio. Referenced from com.googlecode.mp4parser.authoring.tracks.mjpeg.OneJpegPerIframe.
As a workaround isoparser
(which is a dependency for silicompressor) can be added to lint.xml like:
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="InvalidPackage">
<ignore regexp=".*isoparser.*" />
</issue>
</lint>
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.