• Stars
    star
    779
  • Rank 58,364 (Top 2 %)
  • Language
    Kotlin
  • License
    MIT License
  • Created over 3 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

๐Ÿ—œ๏ธCompress Image, Video, and Audio same like Whatsapp ๐Ÿš€โœจ

Would you like to support me?


react-native-compressor

Compress videos, images and audio before upload

react-native-compressor package is a set of functions that allow you compress Image,Audio and Video

If you find this package useful hit the star ๐ŸŒŸ

Table of Contents

Open Table of Contents

Installation

React Native

For React Native<0.65

yarn add react-native-compressor@rnlessthan65

For React Native 0.65 or greater

yarn add react-native-compressor

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, in the project navigator, right click Libraries โžœ Add Files to [your project's name]
  2. Go to node_modules โžœ react-native-compressor and add Compressor.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libCompressor.a to your project's Build Phases โžœ Link Binary With Libraries
  4. Run your project (Cmd+R)<

Android

  1. 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 the getPackages() method
  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', {
  compressionMethod: 'auto',
});

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', {
  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',
  {
    compressionMethod: 'auto',
  },
  (progress) => {
    if (backgroundMode) {
      console.log('Compression Progress: ', progress);
    } else {
      setCompressingProgress(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',
  {},
  (progress) => {
    if (backgroundMode) {
      console.log('Compression Progress: ', progress);
    } else {
      setCompressingProgress(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.mp3',
  { quality: 'medium' }
);

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

API

Image

ImageCompressor

  • compress(value: string, options?: CompressorOptions): Promise<string>

    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 maxWidth and maxHeight are used as a boundary.

CompressorOptions

  • compressionMethod: compressionMethod (default: "manual")

    if you want to compress images like whatsapp then make this prop auto. Can be either manual or auto, defines the Compression Method.

  • maxWidth: number (default: 1280)

    The maximum width boundary used as the main boundary in resizing a landscape image.

  • maxHeight: number (default: 1280)

    The maximum height boundary used as the main boundary in resizing a portrait image.

  • quality: number (default: 0.8)

    The quality modifier for the JPEG file format, can be specified when output is PNG but will be ignored.

  • input: InputType (default: uri)

    Can be either uri or base64, defines the contentents of the value parameter.

  • output: OutputType (default: jpg)

    Can be either jpg or png, defines the output image format.

  • returnableOutputType: ReturnableOutputType (default: uri)

    Can be either uri or base64, defines the Returnable output image format.

Video

  • compress(url: string, options?: videoCompresssionType , onProgress?: (progress: number)): Promise<string>
  • cancelCompression(cancellationId: string): void

    we can get cancellationId from getCancellationId which is the callback method of compress method options

videoCompresssionType

  • compressionMethod: compressionMethod (default: "manual")

    if you want to compress videos like whatsapp then make this prop auto. Can be either manual or auto, defines the Compression Method.

  • maxSize: number (default: 640)

    The maximum size can be height in case of portrait video or can be width in case of landscape video.

  • bitrate: string

    bitrate of video which reduce or increase video size. if compressionMethod will auto then this prop will not work

  • minimumFileSizeForCompress: number (default: 16)

    16 means 16mb. default our package do not compress under 16mb video file. minimumFileSizeForCompress will allow us to change this 16mb offset. fixed #26

  • getCancellationId: function

    getCancellationId is a callback function that gives us compress video id, which can be used in Video.cancelCompression method to cancel the compression

Audio

  • compress(url: string, options?: audioCompresssionType): Promise<string>

audioCompresssionType

  • quality: qualityType (default: medium)
    we can also control bitrate through quality. qualityType can be low | medium | high

Note: Audio compression will be add soon

Background Upload

  • `backgroundUpload: (url: string, fileUrl: string, options: FileSystemUploadOptions, onProgress?: ((writtem: number, total: number) => void) | undefined) => Promise
  • FileSystemUploadOptions
type FileSystemUploadOptions = (
  | {
      uploadType?: FileSystemUploadType.BINARY_CONTENT,
    }
  | {
      uploadType: FileSystemUploadType.MULTIPART,
      fieldName?: string,
      mimeType?: string,
      parameters?: Record<string, string>,
    }
) & {
  headers?: Record<string, string>,
  httpMethod?: FileSystemAcceptedUploadHttpMethod,
  sessionType?: FileSystemSessionType,
};

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": "6",
	"extension": "mp4",
	"height": "1080",
	"size": "16940.0",
	"width": "1920"
}
  • getVideoMetaData(path: string)

Get Real Path

if you want to convert

  • content:// to file:/// for android
  • ph:// to file:/// for IOS

the you can you getRealPath function like this

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

const realPath = await getRealPath(fileUri, 'video'); //   file://file_path.extension
  • getRealPath(path: string, type: string = 'video'|'image')

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
  • generateFilePath(fileextension: string)

Contributing

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

License

MIT

More Repositories

1

react-native-bottomsheet-reanimated

React Native bottom sheet with fully native 60 FPS animations and awesome user experience
TypeScript
274
star
2

react-native-keys

๐Ÿ” Protected .ENVs variables in React Native ๐Ÿš€โœจ
C++
271
star
3

react-native-decompiler

Decompile React Native Android/IOS Bundle.
TypeScript
244
star
4

open-source-react-native-apps

๐Ÿ“ฑ Collaborative List of Open-Source React Native Apps
39
star
5

react-native-component-splitter

VS Code Extension allows splitting React Native Component into Sub-Component
TypeScript
36
star
6

react-native-interactable-reanimated

This is a copy of interactable from react-native-reanimated
JavaScript
34
star
7

react-native-curved-bottom-tabbar

Curved Bottom Tabbar React Native
JavaScript
26
star
8

mtsl

Tangible symlinks using cokidar (CLI)
JavaScript
22
star
9

github-emoji-extension

Github Emoji Chrome Extension ๐Ÿ‘๐Ÿ‘Ž๐Ÿ˜๐ŸŽ‰๐Ÿ˜•โค๐Ÿš€๐Ÿ‘€
TypeScript
22
star
10

linkedin-auto-bot

LinkedIn bot for auto connect
JavaScript
18
star
11

intellij-merge-tool

VS Code extension for open merge tool of intellij
TypeScript
16
star
12

react-native-best-practice

React Native best practices๐Ÿ“šโœจ
JavaScript
12
star
13

expo-library

CLI for creating reusable, modern Expo libraries using monorepo and expo init.
JavaScript
11
star
14

react-native-image-compressor

React Native Compress Image for Android And Ios
Objective-C
10
star
15

react-native-turbomodule-fabric-renderer-boilerpate

Turbomodule and Fabric renderer boilerplate
Java
9
star
16

release-notes-cli

Generate release notes from git commit history either commit range or tag range.
TypeScript
7
star
17

react-native-tiktok-progressbar

TIKTOK video progress bar
JavaScript
7
star
18

react-native-gifsicle

Compress, Optimize and Manipulate GIF in React Native ๐Ÿš€โœจ
C
7
star
19

react-native-emoji-hook

Write emoji by emoji code :D = ๐Ÿ˜„
JavaScript
6
star
20

react-native-masonry-grid

Customizable masonry Flatlist. it just behave like Flatlist but using ScrollView behind the scene
TypeScript
6
star
21

react-native-process-text-intent

Get text from android android.intent.action.PROCESS_TEXT intent-filter
Java
5
star
22

rotate-video

Rotate Single video / Entire directory of videos with FFMPEG
JavaScript
4
star
23

decompiled-whatsapp

Java
3
star
24

ckeditor-boilerplate

JavaScript
2
star
25

clone-boilerplate

clone universal boilerplates for every language (CLI).
TypeScript
2
star
26

React-Native-Sift

Java
2
star
27

react-native-keyboardawareview-spacer

it is useful when you use Portal
JavaScript
2
star
28

react-native-jsi-boilerplate

React Native JSI boilerplate
C++
2
star
29

git-recover

Recover (git add) files that we lost accidentally
TypeScript
1
star
30

fabric-reanimated-repro

TypeScript
1
star
31

git-toolkit

This is a CLI and easy toolkit for git
JavaScript
1
star
32

ReactNativePhotoEditor

license test
Java
1
star
33

multiSearchReact

CSS
1
star
34

boilerplate-examples

add universal boilerplates for clone-boilerplate CLI.
PHP
1
star
35

react-native-usemarkdown-chat

hook for chats markdown in Textinput
TypeScript
1
star
36

nodejs-file-uploader

Nodejs file uploader server (PUT, POST) for https://github.com/numandev1/react-native-compressor backgroundUpload
JavaScript
1
star