gpt4 book ai didi

ruby - FFMPEG 确定视频区域的平均颜色

转载 作者:行者123 更新时间:2023-12-04 22:49:19 25 4
gpt4 key购买 nike

我有一个用例,我想在视频中插入两个水印之一——一个设计用于深色背景,另一个用于浅色背景。假设我想在视频的右上角执行此操作。

如何确定视频右上角的平均颜色?发布这个,我如何通过查看平均颜色来确定使用哪个水印?

我现在有一个解决方案,我正在拍摄等间距的屏幕截图,然后测量平均颜色,但它的速度非常慢,尤其是对于较长的视频。

# Calculate average color
black_distances = []
white_distances = []

movie = FFMPEG::Movie.new(video_file)
(0..movie.duration / 10).each do |second|

# extract a frame
filename = "tmp/watermark/#{SecureRandom.uuid}.jpg"
movie.screenshot filename.to_s, seek_time: second

# analyse frame for color distance
frame = MiniMagick::Image.open(filename)
frame.crop('20%x20%+80%+0')
frame.resize('1x1')
pixel = frame.get_pixels.flatten

distance_from_black = Math.sqrt(((black[0] - pixel[0])**2 + (black[1] - pixel[1])**2 + (black[2] - pixel[2])**2))
distance_from_white = Math.sqrt(((white[0] - pixel[0])**2 + (white[1] - pixel[1])**2 + (white[2] - pixel[2])**2))

black_distances.push distance_from_black
white_distances.push distance_from_white

File.delete(filename) if File.exist?(filename)
end

average_black_distance = black_distances.reduce(:+).to_f / black_distances.size
average_white_distance = white_distances.reduce(:+).to_f / white_distances.size

我也对如何使用生成的 average_black_distance 感到困惑。和 average_white_distance以确定要使用的水印。

最佳答案

通过执行以下操作,我能够更快地做到这一点:

  • 使用单个 ffmpeg 命令截取屏幕截图,而不是遍历 movie.length 并每 x 秒拍摄一次。
  • 在同一个 ffmpeg 命令中裁剪和缩放屏幕截图,而不是使用 MiniMagick。
  • 使用 rm_rf 删除而不是在循环内这样做。
  •     # Create folder for screenshots
    foldername = "tmp/watermark/screenshots/#{medium.id}/"
    FileUtils.mkdir_p foldername

    # Take screenshots
    movie = FFMPEG::Movie.new(video_file)
    `ffmpeg -i #{video_file} -f image2 -vf fps=fps=0.2,crop=in_w/6:in_h/14:0:0,scale=1:1 #{foldername}/out%d.png`

    # Calculate distances
    white = Color .new('#ffffff')
    black = Color .new('#000000')
    distances = []
    Dir.foreach foldername do |f|

    next if %w[. .. .DS_Store].include? f

    f = MiniMagick::Image.open(foldername + f)
    color = f.get_pixels.flatten

    distance_from_black = Color.new(color).color_distance(white)
    distance_from_white = Color.new(color).color_distance(black)

    distances.push distance_from_white - distance_from_black
    end

    如果 distances.inject(0, :+) 的值为正,则拍摄的视频区域位于较亮的一侧。感谢@Aetherus!

    关于ruby - FFMPEG 确定视频区域的平均颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775643/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com