You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NativeScript集成ffmpegCmdSdk安卓库:Java转TS回调异常求助

解决NativeScript中ffmpegCmdSdk安卓库的回调问题

看起来你已经成功让FFmpeg库跑起来了,但回调这块要么卡壳要么只触发onStart,咱来一步步排查和解决:

核心问题分析

从你的代码片段和症状来看,大概率是回调实现方式不对或者线程处理错误导致的,NativeScript和Android原生交互时,Java接口的回调需要遵循特定的写法,不然很容易出现线程阻塞、回调丢失的问题。

具体解决方案

1. 正确实现FFmpegCallBack接口

NativeScript里不能直接声明Java接口,得用java.lang.Object.extend来继承并实现接口方法,这是关键!给你写个完整的示例:

declare const android, com, java: any;
import { application } from "@nativescript/core";

// 1. 先确保FFmpeg库初始化(记得传入App上下文)
com.yyl.ffmpeg.FFmpegUtils.init(application.android.context);

// 2. 正确实现FFmpegCallBack接口
const MyFFmpegCallback = java.lang.Object.extend(com.yyl.ffmpeg.FFmpegCallBack, {
    onStart: function() {
        console.log("FFmpeg任务启动");
        // 注意:如果要更新UI,必须切换到主线程!
        android.os.Handler(android.os.Looper.getMainLooper()).post(() => {
            // 这里写UI更新逻辑,比如显示加载提示
        });
    },

    onProgress: function(progress) {
        console.log(`处理进度:${progress}%`);
        android.os.Handler(android.os.Looper.getMainLooper()).post(() => {
            // 更新进度条之类的UI操作
        });
    },

    onFinish: function(result) {
        console.log(`FFmpeg任务完成,结果:${result}`);
        android.os.Handler(android.os.Looper.getMainLooper()).post(() => {
            // 处理完成后的逻辑,比如隐藏加载提示
        });
    },

    onError: function(errorMsg) {
        console.error(`FFmpeg出错:${errorMsg}`);
        android.os.Handler(android.os.Looper.getMainLooper()).post(() => {
            // 显示错误提示
        });
    }
});

// 3. 初始化FFmpeg实例并持有回调的强引用(关键!避免被GC回收)
const mFFmpeg = com.yyl.ffmpeg.FFmpeg.getInstance();
const ffmpegCallback = new MyFFmpegCallback(); // 要放在全局或者被其他对象持有,别用局部变量

// 4. 执行FFmpeg命令
const cmd = "-i input.mp4 output.mp4"; // 替换成你的命令
mFFmpeg.execute(cmd, ffmpegCallback);

2. 解决你遇到的两个具体症状

  • 应用冻结:十有八九是你在回调里直接做了UI操作!FFmpeg的回调是在后台线程触发的,NativeScript的UI操作必须在主线程执行,所以一定要用android.os.Handler把UI逻辑切到主线程,不然会阻塞UI线程导致冻结。
  • 仅返回onStart:这通常是回调对象被垃圾回收了!如果你的回调是局部变量,NativeScript的GC可能会把它回收,导致Java层找不到回调对象,后续的onProgress/onFinish就触发不了。所以要把回调对象存在全局变量里,或者让某个长期存在的对象持有它的引用。

3. 额外注意事项

  • 确保你已经正确导入了ffmpegCmdSdk的安卓库,在App_Resources/Android/app.gradle里添加了依赖。
  • 检查adb日志里有没有报错,比如找不到类或者方法,可能是库的初始化有问题。

内容的提问来源于stack exchange,提问作者ponnex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:59