addMediaFile method
Appends file to the end of the timeline. Returns whether it was added.
record adds an undo entry; batch imports pass false and record once.
Implementation
Future<bool> addMediaFile(File file, {bool notify = true, bool record = true}) async {
try {
final isImage = _isImageFile(file.path);
final clipId = 'clip_${DateTime.now().microsecondsSinceEpoch}';
if (isImage) {
final img = await decodeImageFromList(await file.readAsBytes());
final size = Size(img.width.toDouble(), img.height.toDouble());
img.dispose();
clipController.addClips([VideoEditorClip(
id: clipId,
file: file,
isImage: true,
duration: const Duration(seconds: 3),
startTime: Duration.zero,
endTime: const Duration(seconds: 3),
volume: 0,
playbackSpeed: 1.0,
thumbnails: [file],
width: size.width,
height: size.height,
hasAudio: false,
)]);
} else {
final info = await VideoRenderService.probe(file);
clipController.addClips([VideoEditorClip(
id: clipId,
file: file,
isImage: false,
duration: info.duration,
startTime: Duration.zero,
endTime: info.duration,
volume: 1.0,
playbackSpeed: 1.0,
width: info.size.width,
height: info.size.height,
hasAudio: info.hasAudio,
)]);
// Use queue to process proxies and thumbnails sequentially to prevent iOS crashes
_addToProcessingQueue(clipId);
}
_activeTrack = null;
_error = null;
if (record) _saveState();
if (notify) notifyListeners();
if (record) _updateVideoPlayerForCurrentClip();
return true;
} catch (e) {
_setError('Failed to read media: $e');
return false;
}
}