react-native-compressor

react-native-compressor

React Native多媒体文件压缩库

react-native-compressor是一个轻量级React Native库,可高效压缩图片、视频和音频文件。支持自动和手动压缩,提供后台上传、文件下载和视频缩略图生成功能。该库仅增加50KB APK大小,远小于FFmpeg,无需了解复杂压缩算法即可轻松使用。

React Native媒体压缩图片压缩视频压缩音频压缩Github开源项目
<img src="https://numan.dev/images/child-lives-matter.png" /> <div align="center"> <img height="150" src="/media/logo.png" /> </div> <br/> <div align="center">

GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars npm

</div>

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

<div align="center"> <h4>Auto/Manual Compression | Background Upload | Download File | Create Video Thumbnail</h4> </div> <br/> <div align="center"> <pre> <img height="90" src="/media/whatsapp_logo.png"/> <img height="90" src="/media/compress_media.png"/> </pre> <h2 align="center">🗜️Compress Image, Video, and Audio same like Whatsapp</h2> </div>

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?

<div align="center"> <a href="https://github.com/numandev1?tab=followers"> <img src="https://img.shields.io/github/followers/numandev1?label=Follow%20%40numandev1&style=social" height="36" /> </a> <a href="https://twitter.com/numandev1/"> <img src="https://img.shields.io/twitter/follow/numandev1?label=Follow%20%40numandev1&style=social" height="36" /> </a> <a href="https://www.youtube.com/channel/UCYCUspfN7ZevgCj3W5GlFAw"><img src="https://img.shields.io/youtube/channel/subscribers/UCYCUspfN7ZevgCj3W5GlFAw?style=social" height="36" /><a/> </br> <a href="https://www.buymeacoffee.com/numan.dev" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: auto !important;width: auto !important;" ></a> </div>

See the Benchmarks

Table of Contents

<details> <summary>Open Table of Contents</summary>

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
  • 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'); // 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

  • 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: "auto")

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

  • downloadProgress?: (progress: number) => void;

    it is callback, only trigger when we pass image url from server

  • progressDivider?: number (default: 0)

    we uses it when we use downloadProgress

  • 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 and PNG file format, if your input file is JPEG and output file is PNG then compressed size can be increase

  • input: InputType (default: uri)

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

  • output: OutputType (default: jpg)

    The quality modifier for the JPEG file format, can be specified when output is PNG but will be ignored. if you wanna apply quality modifier then you can enable disablePngTransparency:true, Note: if you png image have no transparent background then enable disablePngTransparency:true modifier is recommended

  • disablePngTransparency: boolean (default: false)

    when 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 like disablePngTransparency:true, it will convert transparent background to white

  • returnableOutputType: ReturnableOutputType (default: uri)

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

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

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

  • activateBackgroundTask(onExpired?: (data: any) => void): Promise<any>

    if you wanna compress video while app is in backgroup then you should call this method before compression

  • deactivateBackgroundTask(): Promise<any>

    if you call activateBackgroundTask method, then after video compression, you should call deactivateBackgroundTask for disable background task mode.

  • 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

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.

  • downloadProgress?: (progress: number) => void;

    it is callback, only trigger when we pass image url from server

  • progressDivider?: number (default: 0)

    we uses it when we use downloadProgress/onProgress

  • 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: number

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

  • minimumFileSizeForCompress: number (default: 0)

    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 minimumFileSizeForCompress ref #26

if you wanna get video metadata then read this

Audio

  • `compress(url:

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多