addAudioImage static method

Future<XFile> addAudioImage({
  1. void onStatistics(
    1. FFmpegStatistics
    )?,
  2. VideoExportFormat outputFormat = VideoExportFormat.mp4,
  3. String audioPath = '',
  4. String imagePath = '',
})

Implementation

static Future<XFile> addAudioImage({
  void Function(FFmpegStatistics)? onStatistics,
  VideoExportFormat outputFormat = VideoExportFormat.mp4,
  String audioPath = '',
  String imagePath = '',
}) async {
  final String outputPath = kIsWeb
      ? webOutputPath(outputFormat)
      : await ioOutputPath(imagePath, outputFormat);

  String duration = '0';
  final Completer<void> completer = Completer<void>();

  await FFmpegKit.executeAsync('-i $audioPath -hide_banner',
      (FFmpegSession session) async {
    final String? output = await session.getOutput();
    duration = extractDuration(output ?? '') ?? '';
    completer.complete();
  });
  await completer.future;

  final String videoPath = outputPath.replaceAll('.mp4', '_video.mp4');

  await const FFmpegExport().executeFFmpegIO(
    execute:
        '-loop 1 -i $imagePath -c:v h264_videotoolbox -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -crf 32 -t $duration $videoPath',
    outputPath: outputPath,
    outputMimeType: outputFormat.mimeType,
    onStatistics: onStatistics,
  );

  return const FFmpegExport().executeFFmpegIO(
    execute:
        '-i $videoPath -i $audioPath -c:v copy -c:a aac -shortest $outputPath',
    outputPath: outputPath,
    outputMimeType: outputFormat.mimeType,
    onStatistics: onStatistics,
  );
}