Orientação gerada a partir de informações públicas. Apenas para referência.
Easy Video Editor é um plugin leve do Flutter que permite edição básica de vídeo diretamente no Android e iOS sem exigir o FFmpeg. Permite aos usuários cortar, mesclar e ajustar a velocidade de reprodução de vídeos com configuração mínima. Projetado para simplicidade e desempenho, integra-se perfeitamente em aplicativos Flutter, sendo ideal para aplicações que precisam de manipulação rápida de vídeos. O plugin processa mídia de forma eficiente, reduzindo o tamanho do aplicativo e sua complexidade em comparação com dependências pesadas.
Casos de uso
Recortando clips de vídeo
Mesclando vários vídeos
Ajustando a velocidade de reprodução
Criando conteúdo de vídeo curto
Processamento de vídeo simples em aplicativos móveis
Principais recursos
Nenhuma dependência do FFmpeg
Suporte multiplataforma (Android e iOS)
Leve e rápido
API simples para edições comuns
Compressão de vídeo embutida
Indicado para
Desenvolvedores construindo aplicativos centrados em vídeo
Aplicativos que precisam de edição básica de vídeo
Projetos evitando grandes dependências
Ferramentas de vídeo com foco em dispositivos móveis
Aplicativos educacionais ou de mídia social
Considerações
Limitado a recursos básicos de edição
Sem efeitos ou filtros avançados
Dependente das APIs de mídia específicas da plataforma
Pode ter desempenho variável entre dispositivos
Não adequado para edição profissional de vídeo
README original
Snapshot do README original do repositório-fonte vinculado. Consulte o repositório para o conteúdo mais recente.
Easy Video Editor
A powerful Flutter plugin for video editing operations with a simple, chainable API - without FFmpeg dependency. Perform common video editing tasks like trimming, merging, speed adjustment, and more with ease by leveraging native platform capabilities.
Features
🎬 Video Trimming: Cut videos at specified start and end times
🔄 Video Merging: Combine multiple videos into one
⚡ Speed Adjustment: Change video playback speed
🔊 Audio Operations:
Extract audio from video
Remove audio from video
📐 Video Transformations:
Scale video to specific dimensions
Rotate video by specified degrees
Crop video to specific aspect ratios
Flip video horizontally or vertically
🗜️ Video Compression:
Compress videos to standard resolutions (360p to 4K)
Maintains aspect ratio while resizing
🖼️ Thumbnail Generation: Create thumbnails from video frames
🧩 Raw Frame Extraction: Read RGBA8888 pixels from a video frame
📊 Video Metadata: Retrieve detailed information about video files
🔗 Builder Pattern API: Chain operations for complex video editing
📱 Platform Support: Works on both Android and iOS
📦 iOS Package Managers: Supports both CocoaPods and Swift Package Manager
Installation
Add this to your package's pubspec.yaml file:
dependencies:easy_video_editor:^0.1.6
Or install via command line:
flutter pub add easy_video_editor
Usage
Basic Example
import'package:easy_video_editor/easy_video_editor.dart';
// Create a builder instancefinal editor = VideoEditorBuilder(videoPath: '/path/to/video.mp4')
.trim(startTimeMs: 0, endTimeMs: 5000) // Trim first 5 seconds
.speed(speed: 1.5) // Speed up by 1.5x
.removeAudio(); // Remove audio// Export the edited video with progress trackingfinal outputPath = await editor.export(
outputPath: '/path/to/output.mp4', // Optional output path
onProgress: (progress) {
// Progress ranges from 0.0 to 1.0 (0% to 100%)print('Export progress: ${(progress * 100).toStringAsFixed(1)}%');
// Update UI with progress information// e.g., setState(() => exportProgress = progress);
}
);
Advanced Example
final editor = VideoEditorBuilder(videoPath: '/path/to/video.mp4')
// Trim video
.trim(startTimeMs: 1000, endTimeMs: 6000)
// Merge with another video
.merge(otherVideoPaths: ['/path/to/second.mp4'])
// Adjust speed
.speed(speed: 1.5)
// Compress video
.compress(resolution: VideoResolution.p720)
// Crop video
.crop(aspectRatio: VideoAspectRatio.ratio16x9)
// Rotate video
.rotate(degree: RotationDegree.d90)
// Flip video
.flip(flipDirection: FlipDirection.horizontal);
// Export the final videofinal outputPath = await editor.export(
outputPath: '/path/to/output.mp4'// Optional output path
);
// Extract audiofinal audioPath = await editor.extractAudio(
outputPath: '/path/to/output.m4a'// Optional output path, iOS outputs M4A format
);
// Generate thumbnailfinal thumbnailPath = await editor.generateThumbnail(
positionMs: 2000,
quality: 85,
width: 1280, // optional
height: 720, // optional
exactFrame: true, // optional, request exact-frame extraction when supported
outputPath: '/path/to/thumbnail.jpg'// Optional output path
);
// Extract raw RGBA8888 frame pixelsfinal frame = await editor.getFrame(
positionMs: 2000,
width: 320, // optional
height: 180, // optional
exactFrame: true, // optional, request closest exact frame when supported
);
if (frame != null) {
print('Frame: ${frame.width}x${frame.height}');
print('Pixel bytes: ${frame.bytes.length}');
}
// Get video metadatafinal metadata = await editor.getVideoMetadata();
print('Duration: ${metadata.duration} ms');
print('Dimensions: ${metadata.width}x${metadata.height}');
print('Orientation: ${metadata.rotation}°');
print('File size: ${metadata.fileSize} bytes');
print('Creation date: ${metadata.date}');
Progress Tracking
final editor = VideoEditorBuilder(videoPath: '/path/to/video.mp4')
.trim(startTimeMs: 1000, endTimeMs: 10000)
.compress(resolution: VideoResolution.p720);
// Track export progressdouble exportProgress = 0.0;
// Export with progress updatesfinal outputPath = await editor.export(
outputPath: '/path/to/output.mp4',
onProgress: (progress) {
setState(() {
exportProgress = progress; // Update state variable
});
// Use progress value (0.0 to 1.0) to update UI// For example, with a LinearProgressIndicator:// LinearProgressIndicator(value: exportProgress)
}
);
Cancel Operation
final editor = VideoEditorBuilder(videoPath: '/path/to/video.mp4');
// Start an operationfinal outputPath = await editor.trim(startTimeMs: 0, endTimeMs: 5000);
// Cancel the operationawait editor.cancel();
API Reference
VideoEditorBuilder
The main class for chaining video operations.
Constructor
VideoEditorBuilder({required String videoPath}): Creates a new builder instance
Methods
trim({required int startTimeMs, required int endTimeMs}): Trim video to specified duration (outputs MP4)
merge({required List<String> otherVideoPaths}): Merge with other videos, fitting mixed dimensions and orientations into one output canvas (outputs MP4)
speed({required double speed}): Adjust playback speed (e.g., 0.5 for half speed, 2.0 for double speed) (outputs MP4)
removeAudio(): Remove audio track (outputs MP4)
rotate({required RotationDegree degree}): Rotate video by 90, 180, or 270 degrees (outputs MP4)
crop({required VideoAspectRatio aspectRatio}): Crop video to predefined aspect ratio (outputs MP4)
compress({VideoResolution resolution = VideoResolution.p720}): Compress video to standard resolution (outputs MP4)
Available resolutions: 360p, 480p, 720p, 1080p, 2160p (4K)
Maintains original aspect ratio
flip({required FlipDirection flipDirection}): Flip video horizontally or vertically (outputs MP4)
export({String? outputPath, void Function(double progress)? onProgress}): Process all operations and return output path (outputs MP4)
outputPath: Optional custom path for the output file
onProgress: Optional callback that receives progress updates (0.0 to 1.0) during export
extractAudio({String? outputPath}): Extract audio to separate file (outputs M4A on iOS, AAC on Android)
generateThumbnail({required int positionMs, required int quality, int? width, int? height, bool exactFrame = false, String? outputPath}): Generate thumbnail (outputs JPEG)
getFrame({required int positionMs, int? width, int? height, bool exactFrame = false}): Extract raw RGBA8888 frame pixels at the requested video position
getVideoMetadata(): Retrieves detailed metadata about the current video file
get currentPath: Gets the current video path
Platform Specific Setup
Android
Add the following permissions to your AndroidManifest.xml:
The iOS plugin supports both CocoaPods and Swift Package Manager. Flutter will use Swift Package Manager when it is enabled in your Flutter project and will continue to fall back to CocoaPods for existing projects.
On iOS, transformed video exports such as merge, scale, rotate, flip, and crop preserve the source track frame rate when AVFoundation reports one. If the source frame rate is unavailable, the exporter falls back to 30 fps.
Add the following keys to your Info.plist:
<key>NSPhotoLibraryUsageDescription</key><string>This app requires access to the photo library for video editing.</string><key>NSPhotoLibraryAddUsageDescription</key><string>This app requires access to the photo library to save edited videos.</string>
🤝 Contributing
Contributions are always welcome! Here's how you can help:
🐛 Report bugs by opening an issue
💡 Suggest new features or improvements
📝 Improve documentation
🔧 Submit pull requests
License
This project is licensed under the MIT License - see the LICENSE file for details.