React-Native FFmpeg-kit iOS端hevc_videotoolbox编码失败求助
问题
使用ffmpeg-kit-react-native@6.0.2在React Native中实现H264转HEVC编码,iOS端hevc_videotoolbox编码器报错无法工作。
当前代码:
// iOS 端逻辑 await FFmpegKit.execute(`-i ${videoUri} -c:v hevc_videotoolbox -c:a aac -tag:v hvc1 -movflags +faststart -y ${outputUri}`); // Android 端逻辑 await FFmpegKit.execute(`-i ${videoUri} -c:v hevc_omx -c:a aac -tag:v hvc1 -movflags +faststart -y ${outputUri}`);
错误日志:
LOG libavutil 58. 2.100 / 58. 2.100 LOG libavcodec 60. 3.100 / 60. 3.100 LOG libavformat 60. 3.100 / 60. 3.100 LOG libavdevice 60. 1.100 / 60. 1.100 LOG libavfilter 9. 3.100 / 9. 3.100 LOG libswscale 7. 1.100 / 7. 1.100 LOG libswresample 4. 10.100 / 4. 10.100 LOG Input #0, mov,mp4,m4a,3gp,3g2,mj2, from LOG Metadata: LOG major_brand : LOG mp42 LOG LOG minor_version : LOG 1 LOG LOG compatible_brands: LOG isommp41mp42 LOG LOG creation_time : LOG 2024-08-29T02:42:24.000000Z LOG LOG Duration: LOG 00:00:23.10 LOG , start: LOG 0.000000 LOG , bitrate: LOG 1223 kb/s LOG LOG Stream #0:0 LOG [0x1] LOG (und) LOG : Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 1220 kb/s LOG , LOG 30 fps, LOG 30 tbr, LOG 600 tbn LOG (default) LOG LOG Metadata: LOG creation_time : LOG 2024-08-29T02:42:24.000000Z LOG LOG handler_name : LOG Core Media Video LOG LOG vendor_id : LOG [0][0][0][0] LOG LOG Stream mapping: LOG Stream #0:0 -> #0:0 LOG (h264 (native) -> hevc (hevc_videotoolbox)) LOG LOG Press [q] to stop, [?] for help LOG [hevc_videotoolbox @ 0x11af89120] Error encoding frame: -12905 LOG [hevc_videotoolbox @ 0x11af89120] popping: -542398533 LOG [vost#0:0/hevc_videotoolbox @ 0x11af88e50] Error initializing output stream: Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height LOG Conversion failed!
已尝试相关方案但无效,需求是在iOS和Android端实现视频压缩以降低存储成本。
修复方案
1. 补充硬编码必要参数
hevc_videotoolbox对参数格式要求严格,需明确指定分辨率对齐规则和像素格式:
// iOS 端修正命令 await FFmpegKit.execute(`-i ${videoUri} -c:v hevc_videotoolbox -vf scale=trunc(iw/2)*2:trunc(ih/2)*2 -pix_fmt yuv420p -c:a aac -tag:v hvc1 -movflags +faststart -y ${outputUri}`);
scale=trunc(iw/2)*2:trunc(ih/2)*2:强制分辨率为偶数,Videotoolbox不支持奇数分辨率编码-pix_fmt yuv420p:指定通用兼容的像素格式,避免格式不匹配导致的编码失败
2. 切换软件编码器作为备选
如果硬编码仍失败,可使用FFmpeg内置的软件HEVC编码器libx265(需确保安装的FFmpeg Kit包含该组件,full或full-gpl版本已内置):
// iOS 端备选命令 await FFmpegKit.execute(`-i ${videoUri} -c:v libx265 -crf 28 -c:a aac -tag:v hvc1 -movflags +faststart -y ${outputUri}`);
-crf 28:控制视频质量与体积平衡,数值越大文件越小,可在0-51区间调整
3. 确认FFmpeg Kit包类型
检查安装的FFmpeg Kit是否包含硬编码组件,min或basic包可能缺少hevc_videotoolbox,建议安装完整包:
npm install ffmpeg-kit-react-native-full@6.0.2 --save
4. 验证文件访问权限
确保videoUri和outputUri对应的路径在iOS上有合法访问权限,需提前通过权限库申请相册/文件读写权限。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

