如何将带有视频的srt文件保存为视频的一部分?

问题描述 投票:0回答:1

我有一个使用 AI 为视频生成 srt 文件的应用程序,但我想将视频保存到用户的存储中,并将 srt 字幕刻录在视频上,而不仅仅是嵌入。

这是 API 的响应

"fotmated_subtitle": [
        {
            "display_text": "You know those cat are memes that everybody uses in their videos and the TV movie clips that people use.",
            "interval": [
                "0:00:00.000",
                "0:00:04.000"
            ]
        },
        {
            "display_text": "Well, who are the four best free websites to find a move?",
            "interval": [
                "0:00:04.000",
                "0:00:06.240"
            ]
        }
    ]

我可以将其添加为视频上的小部件,该小部件会根据时间间隔进行更改。 我想知道如何保存带有字幕的视频

 Future<void> saveSubtitle() async {
    emit(ExportSubtitleLoading());
    String subtitleFilter = "";
    for (var subtitle in subtitles!.fotmatedSubtitle!) {
      String startTime = subtitle.interval![0];
      String endTime = subtitle.interval![1];
      String text = subtitle.displayText!;
      subtitleFilter +=
          "drawtext=text='$text':enable='between(t,$startTime,$endTime)':x=(w-text_w)/2:y=h-30:fontsize=24:fontcolor=white,";
    }

    final dir = await getTemporaryDirectory();
    String outputPath = '${dir.path}/ex_vid.mp4';
    final arguments = [
      '-i',
      inputFile,
      '-vf',
      subtitleFilter,
      '-c:v',
      'libx264',
      '-c:a',
      'copy',
      outputPath
    ];
    (arguments.join(' ')).logger;
    '=============='.logger;
    await FFmpegKit.execute(arguments.join(' ')).then((session) async {
      final returnCode = await session.getReturnCode();

      if (ReturnCode.isSuccess(returnCode)) {
        ('The Converstion is Success').logger;
        emit(ExportSubtitleSuccess());
      } else if (ReturnCode.isCancel(returnCode)) {
        // CANCEL
        ('The Converstion is Cancelled').logger;
      } else {
        emit(ExportSubtitleerror());
        ('The Converstion Have an Error').logger;
      }
    });
  }

我已经测试了这个方法,但仍然不起作用

这是完整的命令

    String command =
        "-y -i /data/user/0/com.amaa.aistudio/cache/file_picker/Blink-96bdc94a-17df-4f64-b560-90811a44c4f8-Original.mp4 -vf \"drawtext=text='You know those cat are memes that everybody uses in their videos and the TV movie clips that people use.':enable='between(t,0,4.000)':x=(w-text_w)/2:y=h-30:fontsize=24:fontcolor=white,drawtext=text='Well, who are the four best free websites to find a move?':enable='between(t,4.000,6.240)':x=(w-text_w)/2:y=h-30:fontsize=24:fontcolor=white\" -c:v libx264 -c:a copy /data/user/0/com.amaa.aistudio/cache/ex_vid.mp4";

这里还有日志

 FFmpegKit log message: isom
[log] FFmpegKit log message:
[log] FFmpegKit log message:     minor_version   :
[log] FFmpegKit log message: 512
[log] FFmpegKit log message:
[log] FFmpegKit log message:     compatible_brands:
[log] FFmpegKit log message: isomiso2avc1mp41
[log] FFmpegKit log message:
[log] FFmpegKit log message:     comment         :
[log] FFmpegKit log message: vid:v0f044gc0000cj6mnmrc77u1oq5pn100
[log] FFmpegKit log message:
[log] FFmpegKit log message:     aigc_info       :
[log] FFmpegKit log message: {"aigc_label_type": 0}
[log] FFmpegKit log message:
[log] FFmpegKit log message:     encoder         :
[log] FFmpegKit log message: Lavf58.76.100
[log] FFmpegKit log message:
[log] FFmpegKit log message:   Duration:
[log] FFmpegKit log message: 00:00:35.66
[log] FFmpegKit log message: , start:
[log] FFmpegKit log message: 0.000000
[log] FFmpegKit log message: , bitrate:
[log] FFmpegKit log message: 1239 kb/s
[log] FFmpegKit log message:
[log] FFmpegKit log message:   Stream #0:0
[log] FFmpegKit log message: [0x1]
[log] FFmpegKit log message: (und)
[log] FFmpegKit log message: : Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 576x1024 [SAR 1:1 DAR 9:16], 1102 kb/s
[log] FFmpegKit log message: ,
[log] FFmpegKit log message: 47.78 fps,
[log] FFmpegKit log message: 50 tbr,
[log] FFmpegKit log message: 12800 tbn
[log] FFmpegKit log message:  (default)
[log] FFmpegKit log message:
[log] FFmpegKit log message:     Metadata:
[log] FFmpegKit log message:       handler_name    :
[log] FFmpegKit log message: VideoHandler
[log] FFmpegKit log message:
[log] FFmpegKit log message:       vendor_id       :
[log] FFmpegKit log message: [0][0][0][0]
[log] FFmpegKit log message:
[log] FFmpegKit log message:   Stream #0:1
[log] FFmpegKit log message: [0x2]
[log] FFmpegKit log message: (und)
[log] FFmpegKit log message: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
[log] FFmpegKit log message:  (default)
[log] FFmpegKit log message:
[log] FFmpegKit log message:     Metadata:
[log] FFmpegKit log message:       handler_name    :
[log] FFmpegKit log message: SoundHandler
[log] FFmpegKit log message:
[log] FFmpegKit log message:       vendor_id       :
[log] FFmpegKit log message: [0][0][0][0]
[log] FFmpegKit log message:
FFmpegKit log message: [Parsed_drawtext_0 @ 0xb4000077140d5380] Cannot find a valid font for the family Sans
[log] FFmpegKit log message: [AVFilterGraph @ 0xb4000077a5e0afe0] Error initializing filters
[log] FFmpegKit log message: Error reinitializing filters!
[log] FFmpegKit log message: Failed to inject frame into filter network: No such file or directory
[log] FFmpegKit log message: Error while processing the decoded data for stream #0:0
[log] FFmpegKit log message: Conversion failed!
flutter dart ffmpeg dart-pub android-ffmpeg
1个回答
0
投票

如果有人感兴趣,问题出在命令的文本中,文本中有一个逗号

there's
所以我必须进行扩展来解决这个问题

  String get replaceComma => replaceAll("'s", ' is')
      .replaceAll("'re", " are")
      .replaceAll("'ve", " have")
      .replaceAll("'ll", " will")
      .replaceAll("'d", ' would')
      .replaceAll("n't", " not")
      .replaceAll("can't", "can not")
      .replaceAll("'", "");
}
© www.soinside.com 2019 - 2024. All rights reserved.