我有一个使用 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!
如果有人感兴趣,问题出在命令的文本中,文本中有一个逗号
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("'", "");
}