Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork126
🗜️Compress Image, Video, and Audio same like Whatsapp 🚀✨
License
numandev1/react-native-compressor
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
REACT-NATIVE-COMPRESSOR is a react-native package, which helps us to CompressImage,Video, andAudio before uploading, same likeWhatsapp without knowing the compressionalgorithm
Why should we use react-native-compress overFFmpeg?
We should usereact-native-compressor instead ofFFmpeg becausereact-native-compressor gives you same compression ofWhatsapp (Image, Video, and Audio) without knowing the algorithm of compression + it is lightweight only increase50 KB Size Size in APK whileFFmpeg increase ~>9 MB Size inAPK, and we have to give manual image/video/Audo size and quality as well as
If you find this package useful hit the star 🌟
See theBenchmarks
Open Table of Contents
yarn add react-native-compressor
New Architecture (Turbo Module) Supported
you can give feedback onDiscord channel
expo install react-native-compressorAdd the Compressor plugin to your Expo config (app.json,app.config.json orapp.config.js):
{"name":"my app","plugins": ["react-native-compressor"]}Finally, compile the mods:
expo prebuildTo apply the changes, build a new binary with EAS:
eas buildAutomatic linking is supported for bothAndroid andIOS
Note: If you are using react-native version 0.60 or higher you don't need to link this package.
react-native link react-native-compressor
- In XCode, open Podfile
- paste this line
pod 'react-native-compressor', :path => '../node_modules/react-native-compressor'intoPodfile - run this command inside ios folder
pod install - Run your project (
Cmd+R)<
- Open up
android/app/src/main/java/[...]/MainActivity.java
- Add
import com.reactnativecompressor.CompressorPackage;to the imports at the top of the file - Add
new CompressorPackage()to the list returned by thegetPackages()method
- Append the following lines to
android/settings.gradle:include ':react-native-compressor'project(':react-native-compressor').projectDir = new File(rootProject.projectDir,'../node_modules/react-native-compressor/android') - Insert the following lines inside the dependencies block in
android/app/build.gradle:compile project(':react-native-compressor')
import{Image}from'react-native-compressor';constresult=awaitImage.compress('file://path_of_file/image.jpg');// ORconstresult=awaitImage.compress('https://path_of_file/image.jpg',{progressDivider:10,downloadProgress:(progress)=>{console.log('downloadProgress: ',progress);},});
Here is this package comparison of images compression with WhatsApp
import{Image}from'react-native-compressor';constresult=awaitImage.compress('file://path_of_file/image.jpg',{compressionMethod:'manual',maxWidth:1000,quality:0.8,});
import{Video}from'react-native-compressor';constresult=awaitVideo.compress('file://path_of_file/BigBuckBunny.mp4',{},(progress)=>{console.log('Compression Progress: ',progress);});//ORconstresult=awaitVideo.compress('https://example.com/video.mp4',{progressDivider:10,downloadProgress:(progress)=>{console.log('downloadProgress: ',progress);},},(progress)=>{console.log('Compression Progress: ',progress);});
Here is this package comparison of video compression with WhatsApp
import{Video}from'react-native-compressor';constresult=awaitVideo.compress('file://path_of_file/BigBuckBunny.mp4',{compressionMethod:'manual',},(progress)=>{console.log('Compression Progress: ',progress);});
import{Video}from'react-native-compressor';letcancellationVideoId='';constresult=awaitVideo.compress('file://path_of_file/BigBuckBunny.mp4',{compressionMethod:'auto',// getCancellationId for get video id which we can use for cancel compressiongetCancellationId:(cancellationId)=>(cancellationVideoId=cancellationId),},(progress)=>{if(backgroundMode){console.log('Compression Progress: ',progress);}else{setCompressingProgress(progress);}});// we can cancel video compression by calling cancelCompression with cancel video id which we can get from getCancellationId function while compressionVideo.cancelCompression(cancellationVideoId);
import{Audio}from'react-native-compressor';constresult=awaitAudio.compress('file://path_of_file/file_example_MP3_2MG.wav',// recommended wav file but can be use mp3 file{quality:'medium'});// ORconstresult=awaitAudio.compress('file://path_of_file/file_example_MP3_2MG.wav',// recommended wav file but can be use mp3 file{bitrate:64000,samplerate:44100,channels:1,});
import{backgroundUpload}from'react-native-compressor';constheaders={};constuploadResult=awaitbackgroundUpload(url,fileUrl,{httpMethod:'PUT', headers},(written,total)=>{console.log(written,total);});//ORconstuploadResult=awaitbackgroundUpload(url,fileUrl,{uploadType:UploadType.MULTIPART,httpMethod:'POST', headers},(written,total)=>{console.log(written,total);});
for cancellation Upload, there is two ways
- by calling, cancelUpload function
- by calling abort function
import{cancelUpload,backgroundUpload}from'react-native-compressor';// if we will call without passing any param then it will remove last pushed uploadingcancelUpload()// if you pass true as second param then it will cancel all the uploadingcancelUpload("",true)// if there is multiple files are uploading, and you wanna cancel specific uploading then you pass specific video id like thisletvideoId=''constuploadResult=awaitbackgroundUpload(url,fileUrl,{httpMethod:'PUT',getCancellationId:(cancellationId)=>(videoId=cancellationId),},(written,total)=>{console.log(written,total);});cancelUpload(videoId)
import{backgroundUpload}from'react-native-compressor';constabortSignalRef=useRef(newAbortController());constuploadResult=awaitbackgroundUpload(url,fileUrl,{httpMethod:'PUT'},(written,total)=>{console.log(written,total);},abortSignalRef.current.signal);abortSignalRef.current?.abort();// this will cancel uploading
import{download}from'react-native-compressor';constdownloadFileUrl=awaitdownload(url,(progress)=>{console.log('downloadProgress: ',progress);});
import{createVideoThumbnail,clearCache}from'react-native-compressor';constthumbnail=awaitcreateVideoThumbnail(videoUri);awaitclearCache();// this will clear cache of thumbnails cache directory
Compresses the input file URI or base-64 string with the specified options. Promise returns a string after compression has completed. Resizing will always keep the original aspect ratio of the image, the
maxWidthandmaxHeightare used as a boundary.
if you want to compress images likewhatsapp then make this prop
auto. Can be eithermanualorauto, defines the Compression Method.it is callback, only trigger when we pass image url from server
we uses it when we use downloadProgress
The maximum width boundary used as the main boundary in resizing a landscape image.
The maximum height boundary used as the main boundary in resizing a portrait image.
The quality modifier for the
JPEGandPNGfile format, if your input file isJPEGand output file isPNGthen compressed size can be increaseCan be either
uriorbase64, defines the contentents of thevalueparameter.The quality modifier for the
JPEGfile format, can be specified when output isPNGbut will be ignored. if you wanna apply quality modifier then you can enabledisablePngTransparency:true,Note: if you png image have no transparent background then enabledisablePngTransparency:truemodifier is recommendedwhen user add
output:'png'then by default compressed image will have transparent background, and quality will be ignored, if you wanna apply quality then you have to disablePngTransparency likedisablePngTransparency:true, it will convert transparent background to whiteCan be either
uriorbase64, defines the Returnable output image format.
if you wanna get image metadata (exif) thenread this
we can get cancellationId from
getCancellationIdwhich is the callback method of compress method optionsif you wanna compress video while app is in backgroup then you should call this method before compression
if you call
activateBackgroundTaskmethod, then after video compression, you should calldeactivateBackgroundTaskfor disable background task mode.getCancellationIdis a callback function that gives us compress video id, which can be used inVideo.cancelCompressionmethod to cancel the compression
if you want to compress videos likewhatsapp then make this prop
auto. Can be eithermanualorauto, defines the Compression Method.it is callback, only trigger when we pass image url from server
we uses it when we use downloadProgress/onProgress
The maximum size can be height in case of portrait video or can be width in case of landscape video.
bitrate of video which reduce or increase video size. if compressionMethod will auto then this prop will not work
previously default was 16 but now it is 0 by default. 0 mean 0mb. This is an offset, which you can set for minimumFileSizeForCompress will allow this package to dont compress less than or equal to
minimumFileSizeForCompressref#26
if you wanna get video metadata thenread this
- Android: recommended to use
wavfile as we convert mp3 to wav then apply bitrate
we can also control bitrate through quality. qualityType can be
low|medium|highwe can control bitrate of audio through bitrate, it should be in the range of
64000-320000we can control samplerate of audio through samplerate, it should be in the range of
44100 - 192000we can control channels of audio through channels, Typically 1 or 2
exportenumUploadType{BINARY_CONTENT=0,MULTIPART=1,}exportenumUploaderHttpMethod{POST='POST',PUT='PUT',PATCH='PATCH',}exportdeclaretypeHTTPResponse={status:number; headers:Record<string,string>; body:string;};exportdeclaretypeHttpMethod='POST'|'PUT'|'PATCH';exportdeclaretypeUploaderOptions=(|{uploadType?:UploadType.BINARY_CONTENT;mimeType?:string;}|{uploadType:UploadType.MULTIPART;fieldName?:string;mimeType?:string;parameters?:Record<string, string>;})&{headers?:Record<string,string>;httpMethod?:UploaderHttpMethod;getCancellationId?:(cancellationId:string)=>void;};
Note: some of the uploader code is borrowed fromExpoI tested file uploader on this backendNodejs-File-Uploader
for cancellation Upload, there is two ways, you can use one of it
- If we call without passing any param then it will remove the last pushed uploading
- If you pass true as the second param then it will cancel all the uploading
- if there is multiple files are uploading, and you wanna cancel specific uploading then you pass a specific video ID like this
we can useAbortController in backgroundUploadUsage
const abortSignalRef = useRef(new AbortController());abortSignalRef.current?.abort();
createVideoThumbnail( fileUrl: string, options: {header:Object} ): Promise<{ path: string;size: number; mime: string; width: number; height: number; }>
it will save the thumbnail of the video into the cache directory and return the thumbnail URI which you can display
it will clear the cache that was created from createVideoThumbnail, in future this clear cache will be totally customized
if you want to get metadata of video than you can use this function
import{getVideoMetaData}from'react-native-compressor';constmetaData=awaitgetVideoMetaData(filePath);
{"duration": 20.11,"extension": "mp4","height": 1080,"size": 16940.0,"width": 1920}if you want to get metadata of video than you can use this function
import{getImageMetaData}from'react-native-compressor';constmetaData=awaitgetImageMetaData(filePath);
{ "ImageWidth": 4032, "ImageHeight": 3024, "Orientation": 3, "size": 4127057, "extension": "jpg", "exif":{...}}if you want to convert
content://tofile:///for androidph://tofile:///for IOS
then you can callgetRealPath function like this
import{getRealPath}from'react-native-compressor';constrealPath=awaitgetRealPath(fileUri,'video');// file://file_path.extension
if you wanna make random file path in cache folder then you can use this method like this
import{generateFilePath}from'react-native-compressor';constrandomFilePathForSaveFile=awaitgenerateFilePath('mp4');// file://file_path.mp4
Whatsapp: compresses Images,Videos and Audios in every effect way
See thecontributing guide to learn how to contribute to the repository and the development workflow.
MIT
About
🗜️Compress Image, Video, and Audio same like Whatsapp 🚀✨
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.





