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

如何通过React Native获取Android设备支持的编解码器列表?

解决React Native中获取设备支持的视频编解码器(含AV1硬件加速检测)的方案

React Native本身没有提供直接获取系统编解码器列表的API,你需要通过原生模块扩展来实现这个功能,分Android和iOS两个平台处理:

Android平台实现

Android可以通过MediaCodecList类枚举所有可用的编码器,筛选出AV1编码相关的设备,并判断是否为硬件加速:

  1. 编写原生模块(Kotlin示例):
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.WritableMap
import com.facebook.react.bridge.WritableNativeMap
import android.media.MediaCodecList
import android.media.MediaCodecInfo

class CodecModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
    override fun getName(): String = "CodecModule"

    @ReactMethod
    fun getSupportedCodecs(promise: com.facebook.react.bridge.Promise) {
        val codecMap = WritableNativeMap()
        val av1Support = WritableNativeMap()
        var hasHardwareAV1Encoder = false
        var hasSoftwareAV1Encoder = false

        val codecList = MediaCodecList(MediaCodecList.REGULAR_CODECS)
        for (info in codecList.codecInfos) {
            if (!info.isEncoder) continue
            for (type in info.supportedTypes) {
                if (type.equals("video/av01", ignoreCase = true)) {
                    val isHardware = info.isHardwareAccelerated
                    if (isHardware) {
                        hasHardwareAV1Encoder = true
                    } else {
                        hasSoftwareAV1Encoder = true
                    }
                }
            }
        }

        av1Support.putBoolean("hasHardwareEncoder", hasHardwareAV1Encoder)
        av1Support.putBoolean("hasSoftwareEncoder", hasSoftwareAV1Encoder)
        codecMap.putMap("av1", av1Support)
        promise.resolve(codecMap)
    }
}
  1. 注册模块到React Native的Package后,在JS层调用:
import { NativeModules } from 'react-native';
const { CodecModule } = NativeModules;

// 视频转换前的检测逻辑
async function checkAV1Support() {
  try {
    const result = await CodecModule.getSupportedCodecs();
    const av1Info = result.av1;
    if (!av1Info.hasHardwareEncoder) {
      if (av1Info.hasSoftwareEncoder) {
        alert('当前设备仅支持软件AV1编码,转换速度可能较慢');
      } else {
        alert('当前设备不支持AV1编码,无法完成该视频的转换');
      }
    }
    // 支持硬件编码则继续执行转换流程
  } catch (error) {
    console.error('获取编解码器信息失败:', error);
  }
}

iOS平台实现

iOS使用VideoToolbox框架查询AV1编码器的支持情况,重点检测硬件加速能力:

  1. 编写原生模块(Swift示例):
import Foundation
import AVFoundation
import VideoToolbox

@objc(CodecModule)
class CodecModule: NSObject, RCTBridgeModule {
    static func moduleName() -> String! {
        return "CodecModule"
    }
    
    static func requiresMainQueueSetup() -> Bool {
        return true
    }
    
    @objc func getSupportedCodecs(_ resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
        var av1Support: [String: Any] = [:]
        var hasHardwareAV1Encoder = false
        var hasSoftwareAV1Encoder = false
        
        if let codecTypes = VTCompressionSessionCopyAvailableCodecTypes(kCMVideoCodecType_AV1, nil) as? [CFString] {
            for codecType in codecTypes {
                let attributes = VTCompressionSessionGetCodecProperties(nil, codecType)
                if let isHardware = attributes?[kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder] as? Bool, isHardware {
                    hasHardwareAV1Encoder = true
                } else {
                    hasSoftwareAV1Encoder = true
                }
            }
        }
        
        av1Support["hasHardwareEncoder"] = hasHardwareAV1Encoder
        av1Support["hasSoftwareEncoder"] = hasSoftwareAV1Encoder
        resolve(["av1": av1Support])
    }
}
  1. JS层直接复用Android的checkAV1Support函数即可,调用逻辑完全一致。

注意事项

  • Android查询编解码器无需额外权限,iOS也不需要配置特殊权限;
  • 测试时要覆盖不同设备:比如支持AV1硬件编码的新设备(iPhone 15系列、部分Android旗舰)和不支持的旧设备;
  • 若仅需检测AV1编码能力,可简化代码,无需枚举所有编解码器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:22:33