numandev1 / react-native-compressor

🗜️Compress Image, Video, and Audio same like Whatsapp 🚀✨
MIT License
949 stars 93 forks source link
audio background-upload bitrate compress compress-audio compress-images compress-videos compression compressor download downloader image javascript react-native thumbnail thumbnail-generator upload uploader video whatsapp


[![GitHub Repo stars](https://img.shields.io/badge/React_Native-20232A?style=for-the-badge&logo=react&logoColor=61DAFB)](#Installation) [![GitHub Repo stars](https://img.shields.io/badge/Expo-1B1F23?style=for-the-badge&logo=expo&logoColor=white)](#managed-expo) [![GitHub Repo stars](https://img.shields.io/static/v1?style=for-the-badge&message=Discord&color=5865F2&logo=Discord&logoColor=FFFFFF&label=)](https://discord.gg/6Wx8Em8KAN) [![GitHub Repo stars](https://img.shields.io/github/stars/numandev1/react-native-compressor?style=for-the-badge&logo=github)](https://github.com/numandev1/react-native-compressor/stargazers) ![npm](https://img.shields.io/npm/dt/react-native-compressor?style=for-the-badge)

REACT-NATIVE-COMPRESSOR is a react-native package, which helps us to Compress Image, Video, and Audio before uploading, same like Whatsapp without knowing the compression algorithm

Auto/Manual Compression | Background Upload | Download File | Create Video Thumbnail


               

🗜️Compress Image, Video, and Audio same like Whatsapp

Why should we use react-native-compress over FFmpeg?

We should use react-native-compressor instead of FFmpeg because react-native-compressor gives you same compression of Whatsapp (Image, Video, and Audio) without knowing the algorithm of compression + it is lightweight only increase 50 KB Size Size in APK while FFmpeg increase ~> 9 MB Size in APK, and we have to give manual image/video/Audo size and quality as well as

If you find this package useful hit the star 🌟

Would you like to support me?


Buy Me A Coffee

See the Benchmarks

Table of Contents

Open Table of Contents - [Installation](#installation) - [For React Native](#Installation) - [Managed Expo](#managed-expo) - [Usage](#usage) - [Image](#image) - [Automatic Image Compression Like Whatsapp](#automatic-image-compression-like-whatsapp) - [Manual Image Compression](#manual-image-compression) - [ImageCompressor API Docs](#imagecompressor) - [Video](#video) - [Automatic Video Compression Like Whatsapp](#automatic-video-compression-like-whatsapp) - [Manual Video Compression](#manual-video-compression) - [Cancel Video Compression](#cancel-video-compression) - [Video Api Docs](#video-1) - [Audio](#audio) - [Background Upload](#background-upload) - [Cancel Background Upload](#cancel-background-upload) - [Download File](#download) - [Create Video Thumbnail and Clear Cache](#create-video-thumbnail-and-clear-cache) * [Other Utilities](#api) - [Background Upload](#background-upload-1) - [Cancel Background Upload](#cancel-background-upload-1) - [Get Metadata Of Image](#get-metadata-of-image) - [Get Metadata Of Video](#get-metadata-of-video) - [Get Real Path](#get-real-path) - [Get Temp file Path](#get-temp-file-path)

Installation

yarn add react-native-compressor

New Architecture (Turbo Module) Supported

you can give feedback on Discord channel

Managed Expo

expo install react-native-compressor

Add the Compressor plugin to your Expo config (app.json, app.config.json or app.config.js):

{
  "name": "my app",
  "plugins": ["react-native-compressor"]
}

Finally, compile the mods:

expo prebuild

To apply the changes, build a new binary with EAS:

eas build

Automatic linking (for React Native >= 0.60 only)

Automatic linking is supported for both Android and IOS

Linking (for React Native <= 0.59 only)

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

Manual installation

iOS

  1. In XCode, open Podfile
  2. paste this line pod 'react-native-compressor', :path => '../node_modules/react-native-compressor' into Podfile
  3. run this command inside ios folder pod install
  4. Run your project (Cmd+R)<

Android

  1. Open up android/app/src/main/java/[...]/MainActivity.java
  1. 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')
  2. Insert the following lines inside the dependencies block in android/app/build.gradle:
     compile project(':react-native-compressor')

Usage

Image

Automatic Image Compression Like Whatsapp
import { Image } from 'react-native-compressor';

const result = await Image.compress('file://path_of_file/image.jpg');
// OR
const result = await Image.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

Manual Image Compression
import { Image } from 'react-native-compressor';

const result = await Image.compress('file://path_of_file/image.jpg', {
  compressionMethod: 'manual',
  maxWidth: 1000,
  quality: 0.8,
});

Video

Automatic Video Compression Like Whatsapp
import { Video } from 'react-native-compressor';

const result = await Video.compress(
  'file://path_of_file/BigBuckBunny.mp4',
  {},
  (progress) => {
    console.log('Compression Progress: ', progress);
  }
);

//OR

const result = await Video.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

Manual Video Compression
import { Video } from 'react-native-compressor';

const result = await Video.compress(
  'file://path_of_file/BigBuckBunny.mp4',
  {
    compressionMethod: 'manual',
  },
  (progress) => {
    console.log('Compression Progress: ', progress);
  }
);
Cancel Video Compression
import { Video } from 'react-native-compressor';

let cancellationVideoId = '';

const result = await Video.compress(
  'file://path_of_file/BigBuckBunny.mp4',
  {
    compressionMethod: 'auto',
    // getCancellationId for get video id which we can use for cancel compression
    getCancellationId: (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 compression
Video.cancelCompression(cancellationVideoId);

Audio

import { Audio } from 'react-native-compressor';

const result = await Audio.compress(
  'file://path_of_file/file_example_MP3_2MG.wav', // recommended wav file but can be use mp3 file
  { quality: 'medium' }
);

// OR

const result = await Audio.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,
  }
);

Background Upload

import { backgroundUpload } from 'react-native-compressor';

const headers = {};

const uploadResult = await backgroundUpload(
  url,
  fileUrl,
  { httpMethod: 'PUT', headers },
  (written, total) => {
    console.log(written, total);
  }
);

//OR

const uploadResult = await backgroundUpload(
  url,
  fileUrl,
  { uploadType: UploadType.MULTIPART, httpMethod: 'POST', headers },
  (written, total) => {
    console.log(written, total);
  }
);

Cancel Background Upload

for cancellation Upload, there is two ways

  1. by calling, cancelUpload function
  2. by calling abort function
cancelUpload (support single and all)
import { cancelUpload, backgroundUpload } from 'react-native-compressor';

// if we will call without passing any param then it will remove last pushed uploading
cancelUpload()

// if you pass true as second param then it will cancel all the uploading
cancelUpload("",true)

// if there is multiple files are uploading, and you wanna cancel specific uploading then you pass specific video id like this
let videoId=''
const uploadResult = await backgroundUpload(
  url,
  fileUrl,
  { httpMethod: 'PUT',  getCancellationId: (cancellationId) =>(videoId = cancellationId), },
  (written, total) => {
    console.log(written, total);
  }
);
cancelUpload(videoId)
cancel by calling abort
import { backgroundUpload } from 'react-native-compressor';

const abortSignalRef = useRef(new AbortController());

const uploadResult = await backgroundUpload(
  url,
  fileUrl,
  { httpMethod: 'PUT' },
  (written, total) => {
    console.log(written, total);
  },
  abortSignalRef.current.signal
);

abortSignalRef.current?.abort(); // this will cancel uploading

Download File

import { download } from 'react-native-compressor';

const downloadFileUrl = await download(url, (progress) => {
  console.log('downloadProgress: ', progress);
});

Video Thumbnail

import { createVideoThumbnail, clearCache } from 'react-native-compressor';

const thumbnail = await createVideoThumbnail(videoUri);

await clearCache(); // this will clear cache of thumbnails cache directory

API

Image

ImageCompressor

CompressorOptions

if you wanna get image metadata (exif) then read this

Video

videoCompresssionType

if you wanna get video metadata then read this

Audio

audioCompresssionType

Background Upload

export enum UploadType {
  BINARY_CONTENT = 0,
  MULTIPART = 1,
}

export enum UploaderHttpMethod {
  POST = 'POST',
  PUT = 'PUT',
  PATCH = 'PATCH',
}

export declare type HTTPResponse = {
  status: number;
  headers: Record<string, string>;
  body: string;
};

export declare type HttpMethod = 'POST' | 'PUT' | 'PATCH';

export declare type UploaderOptions = (
  | {
      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 from Expo I tested file uploader on this backend Nodejs-File-Uploader

Cancel Background Upload

for cancellation Upload, there is two ways, you can use one of it

Download

Create Video Thumbnail and Clear Cache

Get Metadata Of Video

if you want to get metadata of video than you can use this function

import { getVideoMetaData } from 'react-native-compressor';

const metaData = await getVideoMetaData(filePath);
{
    "duration": 20.11,
    "extension": "mp4",
    "height": 1080,
    "size": 16940.0,
    "width": 1920
}

Get Metadata Of Image

if you want to get metadata of video than you can use this function

import { getImageMetaData } from 'react-native-compressor';

const metaData = await getImageMetaData(filePath);
{
  "ImageWidth": 4032,
  "ImageHeight": 3024,
  "Orientation": 3,
  "size": 4127057,
  "extension": "jpg",
  "exif":{...}
}

Get Real Path

if you want to convert

then you can call getRealPath function like this

import { getRealPath } from 'react-native-compressor';

const realPath = await getRealPath(fileUri, 'video'); //   file://file_path.extension

Get Temp file Path

if you wanna make random file path in cache folder then you can use this method like this

import { generateFilePath } from 'react-native-compressor';

const randomFilePathForSaveFile = await generateFilePath('mp4'); //   file://file_path.mp4

Benchmark

Whatsapp: compresses Images,Videos and Audios in every effect way



Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT