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

Media3 Transformer编码码率异常及旋转问题求助

Media3 Transformers API 视频编码问题修复方案

一、编码参数(码率/帧率/分辨率)未生效问题

  • 确认参数传递链路:需通过EncoderSettings.Builder构建编码参数,再通过TransformationRequest.Builder().setVideoEncoderSettings(encoderSettings)绑定到转换请求中,避免参数未被Transformer正确接收。
  • 修正分辨率计算逻辑:输入视频的90度旋转元数据会干扰尺寸识别,先解析输入媒体的rotationDegrees,再根据实际像素尺寸设置目标分辨率(比如原视频带90度旋转,元数据显示1024x576,实际像素为576x1024,需对应设置竖屏或旋转后的横屏目标尺寸)。
  • 核对码率单位:Media3中码率单位为比特每秒(bps),确保设置setBitrate(1000000)对应1Mbps,而非kbps,避免实际码率超出预期。

二、输出元数据带90度旋转、尺寸显示异常问题

  • 强制清除旋转元数据:通过TransformationRequest.Builder().setVideoRotation(VideoOutputRotation.ROTATE_0)强制输出无旋转标记的视频,同时设置与实际播放尺寸匹配的目标分辨率(比如原视频旋转后显示为1024x576,直接设置目标分辨率为你需要的横屏尺寸,如720x480)。
  • 校验输入媒体真实信息:使用MediaItem.Factory解析输入视频的MediaMetadata,打印videoWidth、videoHeight和rotationDegrees,确认实际像素尺寸,避免被旋转元数据误导。

三、设置BITRATE_MODE_CBR后触发VideoEncoder错误

  • 验证编码器兼容性:部分设备硬件编码器不支持CBR模式,可先切换为软件编码器测试:Transformer.Builder(context).setEncoderSelector(EncoderSelector.SOFTWARE_ONLY),排除硬件编码器限制问题。
  • 微调码率适配CBR模式:日志显示实际码率略高于目标值,可能是CBR模式下编码器需要缓冲空间,尝试将目标码率微调至编码器支持的范围(比如设为1200000bps),或降低帧率后再匹配码率。
  • 捕获详细错误日志:开启Media3详细日志(过滤ExoPlayerImpl、Transformer标签),查看具体编码器错误码(如ERROR_INVALID_OPERATION),针对性调整参数。

示例代码片段

// 构建编码器配置
val encoderSettings = VideoEncoderSettings.Builder()
    .setBitrate(1000000) // 1Mbps
    .setFrameRate(24)
    .setResolution(720, 480)
    .setBitrateMode(VideoEncoderSettings.BITRATE_MODE_CBR)
    .build()

// 构建转换请求,强制去除旋转
val transformationRequest = TransformationRequest.Builder()
    .setVideoEncoderSettings(encoderSettings)
    .setVideoRotation(VideoOutputRotation.ROTATE_0)
    .build()

// 初始化Transformer(先测试软件编码器)
val transformer = Transformer.Builder(context)
    .setEncoderSelector(EncoderSelector.SOFTWARE_ONLY)
    .build()

// 执行转换任务
transformer.startTransformation(
    MediaItem.fromUri(inputUri),
    outputUri,
    transformationRequest,
    object : Transformer.Listener {
        override fun onCompleted(mediaItem: MediaItem) {
            // 处理完成逻辑
        }

        override fun onError(mediaItem: MediaItem, exception: TransformationException) {
            Log.e("TransformerError", exception.message, exception)
        }
    }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:02