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

如何在Jetpack Media3 Transformer中设置码率与FPS

使用Jetpack Media3 Transformer配置自定义视频压缩参数

要实现你指定的视频压缩参数(1280x720分辨率、H.264编码、3Mbps码率、30FPS,音频AAC、44100采样率、128kbps码率,MP4容器且Moov atom前置),可以通过自定义DefaultEncoderFactory修改编码格式参数,同时配置复用器调整MP4结构。以下是具体实现:

1. 自定义编码器工厂配置核心参数

DefaultEncoderFactory允许通过重写configureVideoFormat和configureAudioFormat方法,直接修改编码用的MediaFormat,以此设置码率、FPS、采样率等参数。

完整编码器配置代码

val encoderFactory = object : DefaultEncoderFactory(context) {
    override fun configureVideoFormat(format: MediaFormat, inputFormat: MediaFormat, outputWidth: Int, outputHeight: Int) {
        super.configureVideoFormat(format, inputFormat, 1280, 720)
        // 设置视频码率:3 Mbit/s = 3 * 1024 * 1024 bps
        format.setInteger(MediaFormat.KEY_BIT_RATE, 3 * 1024 * 1024)
        // 设置帧率为30 FPS
        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30)
        // 设置关键帧间隔(通常为帧率的2-3倍,保证 Seek 性能)
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 60)
        // 指定编码格式为H.264
        format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_VIDEO_AVC)
    }

    override fun configureAudioFormat(format: MediaFormat, inputFormat: MediaFormat) {
        super.configureAudioFormat(format, inputFormat)
        // 设置音频码率:128 kbit/s = 128 * 1024 bps
        format.setInteger(MediaFormat.KEY_BIT_RATE, 128 * 1024)
        // 设置采样率为44100 Hz
        format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100)
        // 指定编码格式为AAC
        format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AAC)
    }
}

2. 配置MP4 Moov Atom前置

要让MP4的Moov atom移到文件开头以支持流式传输,需自定义MuxerFactory并设置对应标志位:

val muxerFactory = DefaultMuxerFactory.Builder(context)
    .setMp4MuxerFlags(DefaultMuxerFactory.MP4_MUXER_FLAG_MOOV_ATOM_AT_START)
    .build()

3. 初始化Transformer并执行转码

将自定义的编码器工厂和复用器工厂传入Transformer.Builder,发起转码任务:

val transformer = Transformer.Builder(context)
    .setEncoderFactory(encoderFactory)
    .setMuxerFactory(muxerFactory)
    .setContainerMimeType(MimeTypes.APPLICATION_MP4)
    .build()

// 构建转码请求
val inputUri = Uri.parse("你的输入视频路径")
val outputFile = File(context.cacheDir, "compressed_share_video.mp4")
val outputOptions = MediaOutputOptions.Builder(outputFile)
    .build()

// 执行转码
transformer.start(
    inputUri,
    outputOptions,
    object : Transformer.Listener {
        override fun onCompleted(outputMediaItem: MediaItem) {
            // 转码完成,处理输出文件(如分享逻辑)
        }

        override fun onError(error: TransformerException) {
            // 处理转码错误
        }
    }
)

注意事项

  • 部分设备可能对特定编码参数存在兼容性限制,建议通过MediaCodecList提前检查设备是否支持指定参数组合。
  • 若输入视频帧率低于30FPS,编码器会自动适配,无需额外处理。
  • 码率设置为近似值,实际编码时MediaCodec可能根据画面复杂度和设备性能微调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:40:11