Pakete, Repositories und App-Kategorien suchen

Paketdetailsv1.7.2

flutter_quick_video_encoder

Codieren Sie rohe RGB-Bilder mit Hardware-H264-Encodern in MP4-Videos. Unterstützt auch PCM-Audio und M4A-Dateien.

AndroidiOSmacOS
30-Tage-Downloads
11.700
Likes
28
Pub-Punkte
150

Paket installieren

flutter pub add flutter_quick_video_encoder

Paketübersicht

Aus öffentlichen Paketdaten erstellte Orientierung.

Ein Flutter-Paket, das die effiziente Kodierung von rohen RGB-Frames in MP4-Videos mithilfe von Hardware-H.264-Kodierern auf Android, iOS und macOS ermöglicht. Es unterstützt PCM-Audioeingaben zur Erstellung von M4A-Audiotracks und ist daher ideal für Echtzeit-Videorekordierung und -verarbeitung. Das Paket nutzt native Plattformfunktionen, um hohe Leistung mit minimalem CPU-Verbrauch zu erzielen. Für Entwickler konzipiert, die Multimedia-Anwendungen erstellen, die schnelle, geringe Latenz-Videokodierung erfordern.

Anwendungsfälle

  • Echtzeit-Videorekordierung
  • Live-Streaming-Aufnahme
  • Video-Editierworkflows
  • Video-Komprimierung auf dem Gerät
  • Audio-Video-Synchronisation

Hauptmerkmale

  • Hardwarebeschleunigte H.264-Codierung
  • PCM-Audio-Unterstützung
  • Plattformübergreifende Kompatibilität
  • Geringer CPU-Aufwand
  • Einfache API für Frame-Eingabe

Geeignet für

  • Mobile Video-Apps
  • Kamerabasierte Anwendungen
  • Medienverarbeitungstools
  • Eingebettete Video-Systeme
  • Leistungsstarkes Aufnehmen

Hinweise

  • Benötigt native Plattformberechtigungen
  • Beschränkt auf RGB-Eingabeformat
  • Kein Software-Fallback für die Codierung
  • plattformspezifische Konfiguration erforderlich
  • Audio-Synchronisation erfordert präzise Zeitsteuerung

Original-README

Originaler README-Schnappschuss aus dem verknüpften Quell-Repository. Aktuelle Inhalte finden Sie im Repository.

pub package

Logo

Quickly encode raw RGB images & PCM audio to MP4 video using the system h264 encoder

No Dependencies

FlutterQuickVideoEncoder has zero dependencies besides Flutter, Android, iOS, and MacOS themselves. No FFMPEG.

We use AVFoundation on iOS and MediaCodec on Android. These are native system libraries.

For encoding raw RGB pixels

Unlike the video_compress package, this package takes raw rgb pixel buffers as input, not video files.

⭐ Stars ⭐

Please star this repo & on pub.dev. We all benefit from having a larger community.

Usage

await FlutterQuickVideoEncoder.setup(
    width: 1920,
    height: 1080,
    fps: 60,
    videoBitrate: 2500000,
    audioChannels: 1,
    audioBitrate: 64000,
    sampleRate: 44100,
    filepath: "/documents/video.mp4", // output file
);
for(int i = 0; i < frameCount; i++) {
    Uint8List rgba = _renderVideoFrame(i);  // your video function
    Uint8List pcm = _renderAudioFrame(i); // your audio function
    await FlutterQuickVideoEncoder.appendVideoFrame(rgba); 
    await FlutterQuickVideoEncoder.appendAudioFrame(pcm);
}
await FlutterQuickVideoEncoder.finish();

Example App

Enable the platforms you need.

cd ./example                      
flutter config --enable-macos-desktop                                                      
flutter config --enable-android 
flutter config --enable-ios 
flutter create .
flutter run

Create video frames using ui.Image

The easiest way to render a video frame is to use Flutter!

For example, you can render an RGBA frame using ui.Image

Future<Uint8List> _generateVideoFrame(int frameIndex) async {
    const int boxSize = 50; // Size of the moving box

    // Calculate the box position
    int boxX = (frameIndex * 5) % width;
    int boxY = (frameIndex * 5) % height;

    // Paint the moving box
    final recorder = ui.PictureRecorder();
    final canvas = Canvas(recorder);
    final paint = Paint();

    // Draw a white background
    paint.color = Colors.white;
    canvas.drawRect(Rect.fromLTWH(0, 0, width.toDouble(), height.toDouble()), paint);

    // Draw the blue box
    paint.color = Colors.blue;
    canvas.drawRect(Rect.fromLTWH(boxX.toDouble(), boxY.toDouble(), boxSize.toDouble(), boxSize.toDouble()), paint);

    // Convert canvas to image
    final picture = recorder.endRecording();
    final img = await picture.toImage(width, height);

    // Convert the image to a byte array
    final byteData = await img.toByteData(format: ui.ImageByteFormat.rawRgba);
    return byteData!.buffer.asUint8List();
}

Create video frames from Widgets

You can also create video frames from widgets, using RenderRepaintBoundary

import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'dart:typed_data';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  GlobalKey repaintBoundaryKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return RepaintBoundary(
      key: repaintBoundaryKey,
      child: YourWidget(), // Replace with your actual widget
    );
  }

  // you would then call appendVideoFrame with this data
  Future<Uint8List?> captureWidgetAsRGBA() async {
    try {
      RenderRepaintBoundary boundary = repaintBoundaryKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
      ui.Image image = await boundary.toImage(pixelRatio: 1.0);
      ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
      return byteData?.buffer.asUint8List();
    } catch (e) {
      print(e);
      return null;
    }
  }
}

Kategorien

Quell-Repository

Projekte, die dieses Paket verwenden

Noch keine Daten verfügbar.