FFmpegKit 跨平台抽象层

FFmpegKit 中的跨平台抽象层代表了一种复杂的架构模式,它在保持平台特定优化的同时,实现了跨多个平台的一致 FFmpeg 功能。该抽象层作为统一 API 的基础,无论目标平台如何,开发者都可以使用这些 API。

1、核心架构理念

FFmpegKit 的抽象层遵循基于协议的设计,其中每个平台都实现核心抽象定义的通用接口。该架构围绕三个基本抽象构建:

  • 会话协议 (Session Protocol):定义所有执行会话的契约。
  • 抽象会话实现 (Abstract Session Implementation):提供跨平台的共享功能。
  • 平台特定适配器 (Platform Specific Adapters):处理平台特定的细节。

会话协议作为基石,确保无论你在 Android (Java)、Apple (Objective-C)、Linux (C++) 还是通过框架 (Dart/JavaScript) 使用,核心行为都保持一致。

2、会话接口抽象 (Session Interface)

Session 协议定义了所有平台实现都必须遵循的通用契约。这种并行结构确保了 API 一致性,同时允许每个平台利用其原生优势和约定。

2.1、Apple (Objective-C) 实现

来源: apple/src/Session.h

@protocol Session
@required
- (LogCallback)getLogCallback;
- (long)getSessionId;
- (SessionState)getState;
- (ReturnCode*)getReturnCode;
// ... 其他必需方法
@end

2.2、Linux (C++) 实现

来源: linux/src/Session.h

class Session {
    public:
        virtual ffmpegkit::LogCallback getLogCallback() const = 0;
        virtual long getSessionId() const = 0;
        virtual ffmpegkit::SessionState getState() const = 0;
        virtual std::shared_ptr<ffmpegkit::ReturnCode> getReturnCode() const = 0;
        // ... 其他虚方法
};

3、抽象会话基类 (AbstractSession)

AbstractSession 类提供共享实现,减少了跨平台的代码重复。它实现了共享业务逻辑,同时保持了平台特定的内存管理和线程模型。

3.1、Apple 平台实现

来源: apple/src/AbstractSession.h特点:利用 Objective-C 的引用计数。

@interface AbstractSession : NSObject<Session>
- (instancetype)init:(NSArray*)arguments 
         withLogCallback:(LogCallback)logCallback 
withLogRedirectionStrategy:(LogRedirectionStrategy)logRedirectionStrategy;
- (void)waitForAsynchronousMessagesInTransmit:(int)timeout;
@end

3.2、Linux 平台实现

来源: linux/src/AbstractSession.h

特点:利用 C++ 智能指针。

class AbstractSession : public Session, std::enable_shared_from_this<AbstractSession> {
    public:
        static constexpr int DefaultTimeoutForAsynchronousMessagesInTransmit = 5000;
        AbstractSession(const std::list<std::string>& arguments, 
                       const ffmpegkit::LogCallback logCallback, 
                       const LogRedirectionStrategy logRedirectionStrategy);
        void waitForAsynchronousMessagesInTransmit(const int timeout) const;
};

4、平台专用实现

平台位置关键类/技术专用化特性
Android (Java)android/ffmpeg-kit-android-lib/AbstractSession.java

FFmpegKit.java | 使用 Java 线程模型和 Android 特定优化。 | | Apple (Obj-C) | apple/src/ | Foundation 框架 | 利用 ARC 内存管理和 Apple 特定的性能优化。 | | Linux (C++) | linux/src/ | 原生 C++ 实现 | 使用现代 C++ 特性、智能指针和 Linux 系统调用。 |

5、跨平台一致性机制

抽象层通过以下关键机制保持一致性:

  1. 统一数据模型:所有平台对核心概念使用相同的数据结构。
  • 具有一致格式的 Log 条目
  • 具有标准化成功/失败模式的 ReturnCode
  • 具有相同状态转换的 SessionState 枚举
  • 用于进度跟踪的 Statistics
  1. 同步异步模式:每个平台实现相同的异步/同步执行模式。
  2. 一致的错误处理:所有平台实现相同的策略(返回码、异常堆栈跟踪、日志重定向)。

6、平台适配点

抽象层提供特定的扩展点,平台可以在此注入其独特功能:

  • 线程模型
  • AndroidAsyncTask 和 Java 线程
  • Apple: Grand Central Dispatch (GCD) 和 NSOperationQueue
  • Linuxstd::thread 和 pthread 优化
  • 内存管理
  • Android: Java 垃圾回收 (GC)
  • Apple: 自动引用计数 (ARC)
  • Linux: RAII 和智能指针
  • 文件系统操作
  • 每个平台都将文件系统操作适配为原生约定,同时保持相同的 API 表面。

7、抽象层的优势与集成

7.1、核心优势

  • 开发者生产力:一次学习,随处使用。
  • 代码可重用性:跨平台共享业务逻辑。
  • 可维护性:核心功能在一处更新。
  • 平台优化:每个平台都可以利用原生优势(如 Android 硬件加速 vs Apple Metal),而不破坏 API 兼容性。
  • 测试一致性:所有实现使用相同的测试场景。

7.2、与平台框架集成

抽象层创建了分层抽象,框架特定层构建在核心跨平台抽象之上:

  • Flutter: 将原生抽象包装在 Dart 接口中。
  • React Native: 在原生实现之上提供 JavaScript 绑定。
  • 原生应用: 直接访问平台优化的实现。

7.3、未来可扩展性

架构设计支持通过实现 Session 协议、扩展 AbstractSession 并添加特定优化来引入新平台,确保 FFmpegKit 可以演进以支持新技术,同时保持向后兼容性。

学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

FFmpegKit  跨平台抽象层

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论