Какие варианты я должен использовать для изменения масштаба видео без перекоса их в FFMPEG Rails? - PullRequest
0 голосов
/ 03 июня 2019

Основная проблема возникает при обработке отзыва

Все видео, загружаемые с Apple iOS, будут обрабатываться хорошо. Но все видео, загружаемые с устройств Android, становятся искаженными.

В моем приложении rails я использую Carrierwave: Video и FFMPEG для обработки видео с помощью отложенных заданий.

class VideoUploader < CarrierWave::Uploader::Base

  include CarrierWave::Video
  include CarrierWave::Video::Thumbnailer

  # For carrierwave_backgrounder
  include ::CarrierWave::Backgrounder::Delay

  version :rescaled do
    process encode_video: [
      :mp4,
      resolution: "640x480", # Aspect ratio is preserved automatically
      audio_codec: "aac",
      custom: "-strict experimental -q:v 0 -preset slow -g 30",
      callbacks: { after_transcode: :set_success }
    ]
  end


  version :thumb do
    process thumbnail: [{format: 'png', quality: 10, size: 400, strip: true, logger: Rails.logger}]
    def full_filename for_file
      png_name for_file, version_name
    end
  end

Это правильный скриншот видео

https://drive.google.com/open?id=1D0aNWcVxtL6DbTwBmWWIGzUUuyEyWNOG

Это скриншот видео после обработки видео с FFMPEG

https://drive.google.com/open?id=1vilExHoan2UuRPH9RbiZig58H1TwyewA

(это как вертикально нажатой)


Пожалуйста, помогите мне, если вы знаете решение

1 Ответ

0 голосов
/ 05 июня 2019

Наконец-то я нашел решение и вот оно ...

Мне потребовалась библиотека FFMPEG отдельно в классе.

require 'streamio-ffmpeg'

И вызванная пользовательская функция для выполнения кодирования.

version :rescaled do
 process :encode
end

И метод ENCODE создаст видеообъект ffmpeg и выполнит транскодирование.

def encode
  movie = ::FFMPEG::Movie.new(current_path)
  tmp_path = File.join( File.dirname(current_path),   "tmpfile.mp4" )
  options = "[define the options you want]"
  movie.transcode(tmp_path, options)
  File.rename tmp_path, current_path
end

Это переопределит процессы из carrierwave и выполнит кодирование с помощью ffmpeg

Вот и все ...

Пожалуйста, укажите другие решения, если вы их нашли.

Спасибо ...

Пожалуйста, обратитесь к моей статье для получения дополнительной информации:

Статья об этой проблеме и ее фоне

...