flutter_ffplay

A video player powered by ffmpeg.

Getting Started

This project is a video player using ffmpeg. Currently, plugin supports Android and Windows. It will be appreciated for introducing it to another platforms.

A fully custom IO interface is provided in this plugin, users can provide their own data stream to ffplay.

Compile ffmpeg

Before using this plugin, you need to compile ffmpeg first.

For Android, build script use ANDROID_NDK_HOME to find the android ndk.

For Windows, You need msys2 with msvc, or build with mingw64 toolchains in linux.

For msys2, you should setup vcvarsall before call cxx/build.sh, For example:

set MSYS2_PATH_TYPE=inherit
call "D:\Apps\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
"D:\Apps\msys64\usr\bin\bash.exe" --login cxx/build.sh

Basical usage

First, You need to create an instance of IOHandler. An example of http protocol is provded in example/lib/iohandler.dart

final ioHandler = HttpIOHandler();

Then, create a Playback instance to hold playback information. An onFrame callback can be passed here to get the current position:

final playback = await Playback.create(onFrame: (pts) {
  setState(() {
    if (pts == null) {
      _isPlaying = false;
    } else {
      _isPlaying = true;
      _position = _isSeeking ? _position : pts;
    }
  });
});

Playback instance has textureId and aspectRatio parameters for users to create TextureView:

AspectRatio(
  aspectRatio: playback.aspectRatio,
  child: Texture(textureId: playback.textureId),
)

After that, it is time to create FFMpegContext:

final ctx = FFMpegContext(url, ioHandler, playback);

Then call getStream to get infomation of FFMpegContext:

final streams = await ctx.getStreams();

Finally, call play with a list of FFMpegStream to play.

await ctx.play(streams);

Intergrate into other platforms

Interaction between dart and ffmpeg are achieved by ffi except the playback. To intergrate this plugin to other platforms, you should compile cxx/ffi.cpp with your platform code and add the library path to ffi.dart. Then, you also need to implement the playback by realize the flutter_ffplay method channel.

Libraries

flutter_ffplay