npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ffmpeg-kit-rn

v1.0.0

Published

FFmpeg Kit for React Native

Downloads

12

Readme

FFmpegKit for React Native

1. Features

  • Includes both FFmpeg and FFprobe

  • Supports

    • Both Android and iOS

    • FFmpeg v6.0

    • arm-v7a, arm-v7a-neon, arm64-v8a, x86 and x86_64 architectures on Android

    • Android API Level 24 or later

      • API Level 16 on LTS releases
    • armv7, armv7s, arm64, arm64-simulator, i386, x86_64, x86_64-mac-catalyst and arm64-mac-catalyst architectures on iOS

    • iOS SDK 12.1 or later

      • iOS SDK 10 on LTS releases
    • Can process Storage Access Framework (SAF) Uris on Android

    • 25 external libraries

      dav1d, fontconfig, freetype, fribidi, gmp, gnutls, kvazaar, lame, libass, libiconv, libilbc, libtheora, libvorbis, libvpx, libwebp, libxml2, opencore-amr, opus, shine, snappy, soxr, speex, twolame, vo-amrwbenc, zimg

    • 4 external libraries with GPL license

      vid.stab, x264, x265, xvidcore

    • zlib and MediaCodec Android system libraries

    • bzip2, iconv, libuuid, zlib system libraries and AudioToolbox, VideoToolbox, AVFoundation system frameworks on iOS

  • Includes Typescript definitions

  • Licensed under LGPL 3.0 by default, some packages licensed by GPL v3.0 effectively

2. Installation

yarn add ffmpeg-kit-react-native

2.1 Packages

FFmpeg includes built-in encoders for some popular formats. However, there are certain external libraries that needs to be enabled in order to encode specific formats/codecs. For example, to encode an mp3 file you need lame or shine library enabled. You have to install a ffmpeg-kit-react-native package that has at least one of them inside. To encode an h264 video, you need to install a package with x264 inside. To encode vp8 or vp9 videos, you need a ffmpeg-kit-react-native package with libvpx inside.

ffmpeg-kit provides eight packages that include different sets of external libraries. These packages are named according to the external libraries included. Refer to the Packages wiki page to see the names of those packages and external libraries included in each one of them.

2.1.1 Package Names

The following table shows all package names and their respective API levels, iOS deployment targets defined in ffmpeg-kit-react-native.

(*) - Main https package is the default package

2.2 Enabling Packages

Installing ffmpeg-kit-react-native enables the https package by default. It is possible to enable other packages using the instructions below.

2.2.1 Enabling a Package on Android
  • Edit android/build.gradle file and add the package name in ext.ffmpegKitPackage variable.

    ext {
        ffmpegKitPackage = "<package name>"
    }
    
2.2.2 Enabling a Package on iOS
  • Edit ios/Podfile file and add the package name as subspec. After that run pod install again.

    pod 'ffmpeg-kit-react-native', :subspecs => ['<package name>'], :podspec => '../node_modules/ffmpeg-kit-react-native/ffmpeg-kit-react-native.podspec'
  • Note that if you have use_native_modules! in your Podfile, specifying a subspec may cause the following error. You can fix it by defining ffmpeg-kit-react-native dependency before use_native_modules! in your Podfile.

    [!] There are multiple dependencies with different sources for `ffmpeg-kit-react-native` in `Podfile`:
    
    - ffmpeg-kit-react-native (from `../node_modules/ffmpeg-kit-react-native`)
    - ffmpeg-kit-react-native/video (from `../node_modules/ffmpeg-kit-react-native/ffmpeg-kit-react-native.podspec`)

2.3 Enabling LTS Releases

In order to install the LTS variant, install the https-lts package using instructions in 2.2 or append -lts to the package name you are using.

2.4 LTS Releases

ffmpeg-kit-react-native is published in two variants: Main Release and LTS Release. Both releases share the same source code but is built with different settings (Architectures, API Level, iOS Min SDK, etc.). Refer to the LTS Releases wiki page to see how they differ from each other.

3. Using

  1. Execute FFmpeg commands.

    import { FFmpegKit } from 'ffmpeg-kit-react-native';
    
    FFmpegKit.execute('-i file1.mp4 -c:v mpeg4 file2.mp4').then(async (session) => {
      const returnCode = await session.getReturnCode();
    
      if (ReturnCode.isSuccess(returnCode)) {
    
        // SUCCESS
    
      } else if (ReturnCode.isCancel(returnCode)) {
    
        // CANCEL
    
      } else {
    
        // ERROR
    
      }
    });
  2. Each execute call creates a new session. Access every detail about your execution from the session created.

    FFmpegKit.execute('-i file1.mp4 -c:v mpeg4 file2.mp4').then(async (session) => {
    
      // Unique session id created for this execution
      const sessionId = session.getSessionId();
    
      // Command arguments as a single string
      const command = session.getCommand();
    
      // Command arguments
      const commandArguments = session.getArguments();
    
      // State of the execution. Shows whether it is still running or completed
      const state = await session.getState();
    
      // Return code for completed sessions. Will be undefined if session is still running or FFmpegKit fails to run it
      const returnCode = await session.getReturnCode()
    
      const startTime = session.getStartTime();
      const endTime = await session.getEndTime();
      const duration = await session.getDuration();
    
      // Console output generated for this execution
      const output = await session.getOutput();
    
      // The stack trace if FFmpegKit fails to run a command
      const failStackTrace = await session.getFailStackTrace()
    
      // The list of logs generated for this execution
      const logs = await session.getLogs();
    
      // The list of statistics generated for this execution (only available on FFmpegSession)
      const statistics = await session.getStatistics();
    
    });
  3. Execute FFmpeg commands by providing session specific execute/log/session callbacks.

    FFmpegKit.executeAsync('-i file1.mp4 -c:v mpeg4 file2.mp4', session => {
    
      // CALLED WHEN SESSION IS EXECUTED
    
    }, log => {
    
      // CALLED WHEN SESSION PRINTS LOGS
    
    }, statistics => {
    
      // CALLED WHEN SESSION GENERATES STATISTICS
    
    });
  4. Execute FFprobe commands.

    FFprobeKit.execute(ffprobeCommand).then(async (session) => {
    
      // CALLED WHEN SESSION IS EXECUTED
    
    });
  5. Get media information for a file/url.

    FFprobeKit.getMediaInformation(testUrl).then(async (session) => {
      const information = await session.getMediaInformation();
    
      if (information === undefined) {
    
        // CHECK THE FOLLOWING ATTRIBUTES ON ERROR
        const state = FFmpegKitConfig.sessionStateToString(await session.getState());
        const returnCode = await session.getReturnCode();
        const failStackTrace = await session.getFailStackTrace();
        const duration = await session.getDuration();
        const output = await session.getOutput();
      }
    });
  6. Stop ongoing FFmpeg operations.

  • Stop all sessions
    FFmpegKit.cancel();
  • Stop a specific session
    FFmpegKit.cancel(sessionId);
  1. (Android) Convert Storage Access Framework (SAF) Uris into paths that can be read or written by FFmpegKit and FFprobeKit.
  • Reading a file:

    FFmpegKitConfig.selectDocumentForRead('*/*').then(uri => {
        FFmpegKitConfig.getSafParameterForRead(uri).then(safUrl => {
            FFmpegKit.executeAsync(`-i ${safUrl} -c:v mpeg4 file2.mp4`);
        });
    });
  • Writing to a file:

    FFmpegKitConfig.selectDocumentForWrite('video.mp4', 'video/*').then(uri => {
        FFmpegKitConfig.getSafParameterForWrite(uri).then(safUrl => {
            FFmpegKit.executeAsync(`-i file1.mp4 -c:v mpeg4 ${safUrl}`);
        });
    });
  1. Get previous FFmpeg, FFprobe and MediaInformation sessions from the session history.

    FFmpegKit.listSessions().then(sessionList => {
      sessionList.forEach(async session => {
        const sessionId = session.getSessionId();
      });
    });
    
    FFprobeKit.listFFprobeSessions().then(sessionList => {
      sessionList.forEach(async session => {
        const sessionId = session.getSessionId();
      });
    });
    
    FFprobeKit.listMediaInformationSessions().then(sessionList => {
      sessionList.forEach(async session => {
        const sessionId = session.getSessionId();
      });
    });
  2. Enable global callbacks.

  • Session type specific Complete Callbacks, called when an async session has been completed

    FFmpegKitConfig.enableFFmpegSessionCompleteCallback(session => {
      const sessionId = session.getSessionId();
    });
    
    FFmpegKitConfig.enableFFprobeSessionCompleteCallback(session => {
      const sessionId = session.getSessionId();
    });
    
    FFmpegKitConfig.enableMediaInformationSessionCompleteCallback(session => {
      const sessionId = session.getSessionId();
    });
  • Log Callback, called when a session generates logs

    FFmpegKitConfig.enableLogCallback(log => {
      const message = log.getMessage();
    });
  • Statistics Callback, called when a session generates statistics

    FFmpegKitConfig.enableStatisticsCallback(statistics => {
      const size = statistics.getSize();
    });
  1. Register system fonts and custom font directories.

    FFmpegKitConfig.setFontDirectoryList(["/system/fonts", "/System/Library/Fonts", "<folder with fonts>"]);

4. Test Application

You can see how FFmpegKit is used inside an application by running react-native test applications developed under the FFmpegKit Test project.

5. Tips

See Tips wiki page.

6. License

See License wiki page.

7. Patents

See Patents wiki page.