run method

  1. @override
Future<PostProcessResult> run({
  1. required String inM3u8,
  2. required String outMp4,
  3. required M3u8Task task,
  4. void onBytes(
    1. int bytes
    )?,
})
override

Implementation

@override
Future<PostProcessResult> run({
  required String inM3u8,
  required String outMp4,
  required M3u8Task task,
  void Function(int bytes)? onBytes,
}) async {
  if (!Platform.isIOS) {
    return PostProcessResult(ret: -1, playableUrl: inM3u8);
  }

  StreamSubscription? sub;
  final completer = Completer<PostProcessResult>();

  sub = FfmpegRemuxIos.eventStream.listen((e) async {
    if (e.taskId != task.taskId) return;

    // 伪 bytes:用于 UI
    onBytes?.call((e.progress * 1000000).toInt());

    if (!e.isDone) return;

    await sub?.cancel();

    if (e.isSuccess) {
      completer.complete(PostProcessResult(ret: 0, outMp4: e.outPath ?? outMp4, playableUrl: e.outPath ?? outMp4));
    } else {
      completer.complete(PostProcessResult(ret: e.ret ?? -1, playableUrl: inM3u8));
    }
  });

  // 发起异步任务(立刻返回,不堵 UI)
  await FfmpegRemuxIos.startRemux(
    taskId: task.taskId,
    inM3u8: inM3u8,
    outPath: outMp4,
  );

  return completer.future;
}