如何在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
相关产品推荐
相关产品推荐

