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

Rails中FFMPEG gem获取视频平均码率异常问题求助

解决FFMPEG gem获取视频平均码率不准确的问题

排查方向1:确认FFMPEG返回的原始码率值

先在工具模块中添加日志,查看movie.bitrate的原始输出(单位为千比特每秒/kbps),确认数值是否符合预期:

movie = FFMPEG::Movie.new(path)
Rails.logger.info "FFMPEG raw bitrate: #{movie.bitrate}, duration: #{movie.duration}"
media_detail = {duration: movie.duration, bitrate: movie.bitrate, resolution: movie.resolution}

如果日志里movie.bitrate为nil或明显偏离实际值,说明FFMPEG对该视频格式的码率识别有问题,建议换用文件大小+时长的方式计算真实平均码率。

排查方向2:检查数据库存储字段类型

确保存储bitrate的数据库字段为整数类型(如int/bigint),避免用字符串或浮点型字段导致数值精度丢失或转换错误。

修正转换逻辑(处理空值)

如果bitrate可能为nil,转换函数需增加空值判断,避免得到无效的0值:

def convert_bit_to_byte(bitrate_value)
  return 0 unless bitrate_value.present?
  bitrate_value.to_i * 125
end

更准确的平均码率计算方法(推荐)

对于可变码率(VBR)视频,FFMPEG返回的bitrate可能是标称值而非真实平均码率,建议通过文件总字节数 ÷ 视频时长计算真实平均码率:

# 在工具模块中计算并存储真实平均码率(字节/秒)
movie = FFMPEG::Movie.new(path)
file_size_bytes = File.size(path)
average_bitrate_bytes = file_size_bytes / movie.duration if movie.duration > 0
media_detail = {
  duration: movie.duration,
  bitrate: average_bitrate_bytes, # 直接存储字节/秒的码率
  resolution: movie.resolution
}

展示时直接传入number_to_human_size即可:

number_to_human_size(file.bitrate) + "/s"

额外检查

  • 确认服务器上的FFMPEG版本为最新稳定版,旧版本可能存在格式兼容问题。
  • 测试不同格式的视频(如MP4、MKV、AVI),排查是否为特定格式的识别问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:35:14