I've an application that generate srt file for a video with AI but I want to save the video to user's storage with the srt subtitle burned on the video not just embedded.
this is the response form the 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"
]
}
]
I could add this as a widget over the video that would change accourding to intervals. I want to know How to save that video with the subtitle
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;
}
});
}
I've tested this method but still does not worked
here is the full command
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";
also here is the logs
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!
if anybody interested the problem was in the text of the command there was a comma in the text there's
so I have to make an extension to solve this issue
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("'", "");
}