如何通过React Native获取Android设备支持的编解码器列表?
解决React Native中获取设备支持的视频编解码器(含AV1硬件加速检测)的方案
React Native本身没有提供直接获取系统编解码器列表的API,你需要通过原生模块扩展来实现这个功能,分Android和iOS两个平台处理:
Android平台实现
Android可以通过MediaCodecList类枚举所有可用的编码器,筛选出AV1编码相关的设备,并判断是否为硬件加速:
- 编写原生模块(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) } }
- 注册模块到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编码器的支持情况,重点检测硬件加速能力:
- 编写原生模块(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]) } }
- JS层直接复用Android的
checkAV1Support函数即可,调用逻辑完全一致。
注意事项
- Android查询编解码器无需额外权限,iOS也不需要配置特殊权限;
- 测试时要覆盖不同设备:比如支持AV1硬件编码的新设备(iPhone 15系列、部分Android旗舰)和不支持的旧设备;
- 若仅需检测AV1编码能力,可简化代码,无需枚举所有编解码器。
内容的提问来源于stack exchange,提问作者Atul Tiwaree
相关产品推荐
相关产品推荐

