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

