Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby×AWSで作る動画変換システム 東京Ruby会議12

yumu
January 18, 2025
28

 Ruby×AWSで作る動画変換システム 東京Ruby会議12

yumu

January 18, 2025
Tweet

Transcript

  1. 6 アジェンダ 1. システムのアーキテクチャ • なぜ自前実装を選択したのか • アーキテクチャの詳細 2. 実装の核となる技術

    • streamio-ffmpeg • Shoryuken 3. 開発・運用の実際 • 開発環境 • モニタリング • リソース監視と最適化
  2. 8 SaaS VS 自前実装 SaaS 自前実装 e.g. AWS MediaConvert e.g.

    FFmpegを直接使用 ⭕ APIを通して簡単に利用できる ⭕ 費用が安い ⭕ 運用の手間が少ない ⭕ 変換のカスタマイズ性が高い ✖ 処理件数に応じて費用が増加 ✖ 実装・運用に手間がかかる ✖ 変換のカスタマイズ性に制限があ る
  3. 9 SaaS VS 自前実装 SaaS 自前実装 e.g. AWS MediaConvert e.g.

    FFmpegを直接使用 ⭕ APIを通して簡単に利用できる ⭕ 費用が安い ⭕ 運用の手間が少ない ⭕ 変換のカスタマイズ性が高い ✖ 処理件数に応じて費用が増加 ✖ 実装・運用に手間がかかる ✖ 変換のカスタマイズ性に制限があ る streamio-ffmpeg https://github.com/streamio/streamio-ffmpeg
  4. 11 全体アーキテクチャ Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス スキャン 動画を取得

    ポーリング 動画にタグを付与 S3 SQS ポーリング ウイルススキャン イベント送信 動画にタグを付与
  5. 12 全体アーキテクチャ Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス スキャン イベント送信

    メッセージ送信 動画を取得 ポーリング 動画にタグを付与 S3 SQS Lambda SQS イベント送信 チェックOKの場合、メッ セージ送信
  6. 13 全体アーキテクチャ Shoryuken Shoryuken Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス

    スキャン イベント送信 メッセージ送信 動画を取得 ポーリング 動画にタグを付与 ポーリング 動画を取得 変換後の動画をアップロード 動画の変換 S3 SQS Lambda SQS 変換後の動画を アップロード 動画を変換
  7. 14 全体アーキテクチャ Shoryuken Shoryuken Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス

    スキャン イベント送信 メッセージ送信 動画を取得 ポーリング 動画にタグを付与 ポーリング 動画を取得 変換後の動画をアップロード 動画の変換 S3 SQS Lambda SQS
  8. 16 streamio-ffmpeg gemの活用 movie = FFMPEG::Movie.new('input.mp4') puts movie.duration # 動画の長さ

    puts movie.resolution # 解像度 puts movie.bitrate # ビットレート movie.transcode('output.mp4', { video_codec: 'libx264', # H.264でエンコード resolution: '640x360', # 解像度を指定 video_bitrate: 800 # ビットレートを指定 }) { |progress| puts "変換進捗: #{progress * 100}%" }
  9. 17 streamio-ffmpeg gemの活用 movie = FFMPEG::Movie.new('input.mp4') puts movie.duration # 動画の長さ

    puts movie.resolution # 解像度 puts movie.bitrate # ビットレート movie.transcode('output.mp4', { video_codec: 'libx264', # H.264でエンコード resolution: '640x360', # 解像度を指定 video_bitrate: 800 # ビットレートを指定 }) { |progress| puts "変換進捗: #{progress * 100}%" } ffmpeg -i input.mp4 -vcodec libx264 -s 640x360 -b:v 800k output.mp4
  10. 18 streamio-ffmpeg gemの活用 movie = FFMPEG::Movie.new('input.mp4') puts movie.duration # 動画の長さ

    puts movie.resolution # 解像度 puts movie.bitrate # ビットレート movie.transcode('output.mp4', { video_codec: 'libx264', # H.264でエンコード resolution: '640x360', # 解像度を指定 video_bitrate: 800 # ビットレートを指定 }) { |progress| puts "変換進捗: #{progress * 100}%" } ffmpeg -i input.mp4 -vcodec libx264 -s 640x360 -b:v 800k output.mp4 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
  11. 19 デモ: 実際の変換処理 movie = FFMPEG::Movie.new('sample.mov') puts "=== 変換前の動画情報 ==="

    puts "長さ: #{movie.duration}秒" movie.transcode('output.mp4', { video_codec: 'libx264', resolution: '360x640', video_bitrate: 100 }) { |progress| print "\r進捗: #{progress * 100}%" } result = FFMPEG::Movie.new('output.mp4') puts "\n\n=== 変換後の動画情報 ===" puts "長さ: #{result.duration}秒"
  12. 23 Shoryukenによる非同期処理 class VideoConverterWorker include Shoryuken::Worker shoryuken_options queue: 'video_converter_queue', auto_delete:

    true, body_parser: :json, auto_visibility_timeout: true def perform(sqs_msg, body) # ここに処理を実装 end end https://github.com/ruby-shoryuken/shoryuken
  13. 24 Shoryukenによる非同期処理 def perform(sqs_msg, body) # S3から動画をダウンロード download_from_s3(body['video_key'], input_path) #

    動画の変換処理(作品詳細ページ用と作品一覧ページ用) movie = FFMPEG::Movie.new(input_path) movie.transcode(detail_path, detail_options) movie.transcode(thumbnail_path, thumbnail_options) # 変換後の動画をS3にアップロード upload_to_s3("detail/#{body['video_key']}", detail_path) upload_to_s3("thumbnail/#{body['video_key']}", thumbnail_path) end
  14. 26 開発環境 services: localstack: image: localstack/localstack environment: - SERVICES=s3,sqs ports:

    - "4566:4566" worker: build: . environment: - AWS_ENDPOINT=http://localstack:4566 volumes: - .:/app