es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La concatenación/unión de audio de FFmpeg no funciona correctamente en Flutter.

Estoy concatenando/juntando audio usando ffmpegkitflutter con el siguiente comando. Pero la duración del archivo unido no es correcta.

"-i concat:${audioFile1}|${audioFile2} -acodec copy $outPath"

Tengo dos archivos de audio, el primer archivo tiene una duración de 27s y el segundo archivo tiene una duración de 1m 47s.

Después de unir ambos archivos, la duración real del archivo es de 2m 14s.

Pero cuando ingresamos el primer archivo en la primera entrada y el segundo archivo en la segunda entrada, la duración del archivo de salida es de 2m 53s.

Y si ingresamos el segundo archivo en la primera entrada y el primer archivo en la segunda entrada, la duración del archivo de salida es de 2m 6s.

Aquí está mi código:

var cmd = "-i concat:${audioFile2.path}|${audioFile1.path} -acodec copy $outPath";

FFmpegKit.executeAsync(cmd, (session) async {
      final returnCode = await session.getReturnCode();
      log("returnCode $returnCode");
    });

Por favor, ayúdame a obtener la duración correcta después de unir ambos archivos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Posibles soluciones para obtener la duración correcta después de unir archivos de audio utilizando ffmpeg_kit_flutter son:

    1. Utilizar la duración de los archivos de audio de entrada para calcular la duración total del archivo unido, y establecer este valor en los metadatos del archivo audio de salida. Esto se puede hacer con el siguiente comando:
    "-i \"concat:${audioFile1}|${audioFile2}\" -filter_complex amix=inputs=2:duration=longest -acodec copy -metadata duration=<total_duration> $outPath"
    

    En este comando, se utiliza el filtro amix para fusionar las entradas de audio y la opción duration se establece en longest para asegurar que la duración de salida coincida con la duración más larga de las entradas. La opción metadata duration establece la duración total del archivo audio de salida.

    Para calcular la duración total del archivo unido, se puede utilizar la clase MediaInfo del paquete flutter_ffmpeg, el cual proporciona información sobre los archivos multimedia:

    import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';
    
    final mediaInfo1 = await FlutterFFmpeg().getMediaInformation(audioFile1.path);
    final mediaInfo2 = await FlutterFFmpeg().getMediaInformation(audioFile2.path);
    
    final totalDuration = Duration(
      seconds: mediaInfo1.getDuration() + mediaInfo2.getDuration(),
    );
    
    final cmd = "-i \"concat:${audioFile1}|${audioFile2}\" -filter_complex amix=inputs=2:duration=longest -acodec copy -metadata duration=${totalDuration.inSeconds} $outPath";
    
    1. Utilizar la opción -t para limitar la duración de la salida a la duración del archivo de audio de entrada más corto. Esto se puede hacer con el siguiente comando:
    "-i \"concat:${audioFile1}|${audioFile2}\" -t <shortest_duration> -acodec copy $outPath"
    

    En este comando, la opción -t limita la duración de salida a la duración del archivo de audio de entrada más corto. Para determinar la duración más corta, se pueden comparar las duraciones de ambos archivos de entrada:

    final mediaInfo1 = await FlutterFFmpeg().getMediaInformation(audioFile1.path);
    final mediaInfo2 = await FlutterFFmpeg().getMediaInformation(audioFile2.path);
    
    final shortestDuration = Duration(
      seconds: math.min(mediaInfo1.getDuration(), mediaInfo2.getDuration()),
    );
    
    final cmd = "-i \"concat:${audioFile1}|${audioFile2}\" -t ${shortestDuration.inSeconds} -acodec copy $outPath";
    

    Cualquiera de las soluciones debería garantizar que la duración de salida coincida con la duración esperada después de unir los archivos de audio de entrada.

Comments are closed.