写点什么

harmony_flutter_videoCompress(视频压缩)

作者:flfljh
  • 2024-12-18
    湖南
  • 本文字数:2157 字

    阅读完需:约 7 分钟

harmony_flutter_videoCompress(视频压缩)

一.MethodChannel

1.flutter 端代码


  • 创建 MethodChannel 交互通道 video_compress

  • 接收 ohos 端传递过来的进度


  final compressProgress$ = ObservableBuilder<double>();  final _channel = const MethodChannel('video_compress');
@protected void initProcessCallback() { _channel.setMethodCallHandler(_progressCallback); }
MethodChannel get channel => _channel;
bool _isCompressing = false;
bool get isCompressing => _isCompressing;
@protected void setProcessingStatus(bool status) { _isCompressing = status; }
Future<void> _progressCallback(MethodCall call) async { switch (call.method) { case 'updateProgress': final progress = double.tryParse(call.arguments.toString()); if (progress != null) compressProgress$.next(progress); break; } }
复制代码


封装请求方法,传递压缩参数final jsonStr = await _invoke<String>('compressVideo', {  'path': path,  'quality': quality.index,  'deleteOrigin': deleteOrigin,  'startTime': startTime,  'duration': duration,  'includeAudio': includeAudio,  'frameRate': frameRate,});
复制代码


2.ohos 端代码


  • 继承 FlutterPlugin 实现 onAttachedToEngine 方法

  • 创建 MethodChannel 实例 video_compress

  • onMethodCall 回调中监听回调方法(名字需要与 flutter 端保持一致)

  • 通过 MethodResult 回传参数


const CHANNEL_NAME = "video_compress";
private methodChannel: MethodChannel | null = null; private applicationContext: Context | null = null; private ability: UIAbility | null = null; private unity: Unity | null = null; private videoCompress: VideoCompress | null = null;
onAttachedToAbility(binding: AbilityPluginBinding): void { Log.i(TAG, "onAttachedToAbility"); this.ability = binding.getAbility(); this.unity = new Unity(this.ability.context); this.videoCompress = new VideoCompress(this.ability.context); }
onDetachedFromAbility(): void { Log.i(TAG, "onDetachedFromAbility"); this.ability = null; }
onAttachedToEngine(binding: FlutterPluginBinding): void { this.applicationContext = binding.getApplicationContext(); this.methodChannel = new MethodChannel(binding.getBinaryMessenger(), CHANNEL_NAME); this.methodChannel.setMethodCallHandler(this); }
onDetachedFromEngine(binding: FlutterPluginBinding): void { this.applicationContext = null; this.methodChannel?.setMethodCallHandler(null); this.methodChannel = null; } onMethodCall(call: MethodCall, result: MethodResult): void { Log.d(TAG, "call: " + call.method)
try { switch (call.method) { case 'compressVideo': { const path = call.argument("path") as string; const quality = call.argument("quality") as number; const deleteOrigin = call.argument("deleteOrigin") as boolean; const startTime = call.argument("startTime") as number; const duration = call.argument("duration") as number;
Log.d(TAG, JSON.stringify({ path, quality, deleteOrigin, startTime, duration })) Log.d(TAG, path)
let includeAudio = call.argument("includeAudio") as boolean | undefined; if (includeAudio === undefined) { includeAudio = true; }
let frameRate = call.argument("frameRate") as number | undefined; if (frameRate === undefined) { frameRate = 30; }
const tempDir = this.applicationContext!.tempDir; const out: string = dayjs().format('YYYY-MM-DD HH-mm-ss'); const destPath: string = tempDir + "/VID_" + out + ".mp4";
Log.d(TAG, destPath)
this.methodChannel?.invokeMethod("updateProgress", 1) this.videoCompress?.compress(path, quality).then(out => { if (deleteOrigin) { fs.unlinkSync(path); } this.unity?.getMediaInfoJson(out).then((json) => { Log.d(TAG, JSON.stringify(json)) json['isCancel'] = false; this.methodChannel?.invokeMethod("updateProgress", 100) result.success(JSON.stringify(json)) }) }) break; } default: result.notImplemented() } } catch (err) { result.error("Name not found", err.message, null) } }
复制代码


用户头像

flfljh

关注

还未添加个人签名 2024-10-29 加入

还未添加个人简介

评论

发布
暂无评论
harmony_flutter_videoCompress(视频压缩)_flfljh_InfoQ写作社区