Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby×AWSで作る動画変換システム 東京Ruby会議12
Search
yumu
January 18, 2025
3.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby×AWSで作る動画変換システム 東京Ruby会議12
yumu
January 18, 2025
More Decks by yumu
See All by yumu
minneのショート動画基盤の設計と運用改善 カバーとGMOペパボが語る、クリエイターの創作・表現活動を支える技術
yumu
0
620
Railsアプリから何を切り出す?機能分離の判断基準 Kaigi on Rails 2025
yumu
2
6.9k
影響を広げる力研修 GMOペパボ2025新卒エンジニア研修
yumu
0
1.9k
分散オブジェクトで遊ぼう!〜dRubyで作るマルチプレイヤー迷路ゲーム〜 関西Ruby会議08
yumu
1
1.7k
Google Cloudで作るニアリアルタイムアクセス解析基盤 GDG DevFest Tokyo 2024 LT
yumu
0
3.8k
アクセス解析基盤のデータストア選定奮闘記 CloudNative Days Winter 2024 船上LT会
yumu
0
230
minneのShoryuken活用 Kaigi on Rails 2024 スポンサーLT
yumu
3
2.6k
Rubyでも動画変換簡単にできるよ TokyuRuby会議15スポンサーLT
yumu
0
180
文系の私が新卒エンジニアになるまで
yumu
4
1.4k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Paper Plane
katiecoart
PRO
1
51k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Mind Mapping
helmedeiros
PRO
1
250
Un-Boring Meetings
codingconduct
0
320
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The SEO Collaboration Effect
kristinabergwall1
1
490
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Transcript
Ruby×AWSで作る 動画変換システム yumu 2025.01.18 東京Ruby会議12 1
2 自己紹介 GMOペパボ minne事業部 プロダクト開発チーム 2023年 新卒入社 湯村 美吹香 yumu エンジニア5年目。 バックエンドが主戦場ですが、フロントやインフラもや
ります! KoRのスポンサーLTをしてました。 • 最近の推し漫画 : メダリスト⛸ • X : @myumura3
3 minneとは
4 動画投稿機能をリリースしました🎉
5 動画を配信するには変換処理が必要 変換
6 アジェンダ 1. システムのアーキテクチャ • なぜ自前実装を選択したのか • アーキテクチャの詳細 2. 実装の核となる技術
• streamio-ffmpeg • Shoryuken 3. 開発・運用の実際 • 開発環境 • モニタリング • リソース監視と最適化
7 1. システムのアーキテクチャ
8 SaaS VS 自前実装 SaaS 自前実装 e.g. AWS MediaConvert e.g.
FFmpegを直接使用 ⭕ APIを通して簡単に利用できる ⭕ 費用が安い ⭕ 運用の手間が少ない ⭕ 変換のカスタマイズ性が高い ✖ 処理件数に応じて費用が増加 ✖ 実装・運用に手間がかかる ✖ 変換のカスタマイズ性に制限があ る
9 SaaS VS 自前実装 SaaS 自前実装 e.g. AWS MediaConvert e.g.
FFmpegを直接使用 ⭕ APIを通して簡単に利用できる ⭕ 費用が安い ⭕ 運用の手間が少ない ⭕ 変換のカスタマイズ性が高い ✖ 処理件数に応じて費用が増加 ✖ 実装・運用に手間がかかる ✖ 変換のカスタマイズ性に制限があ る streamio-ffmpeg https://github.com/streamio/streamio-ffmpeg
10 全体アーキテクチャ 署名付きURL 動画アップロード S3 署名付きURL 動画ダイレクト アップロード
11 全体アーキテクチャ Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス スキャン 動画を取得
ポーリング 動画にタグを付与 S3 SQS ポーリング ウイルススキャン イベント送信 動画にタグを付与
12 全体アーキテクチャ Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス スキャン イベント送信
メッセージ送信 動画を取得 ポーリング 動画にタグを付与 S3 SQS Lambda SQS イベント送信 チェックOKの場合、メッ セージ送信
13 全体アーキテクチャ Shoryuken Shoryuken Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス
スキャン イベント送信 メッセージ送信 動画を取得 ポーリング 動画にタグを付与 ポーリング 動画を取得 変換後の動画をアップロード 動画の変換 S3 SQS Lambda SQS 変換後の動画を アップロード 動画を変換
14 全体アーキテクチャ Shoryuken Shoryuken Shoryuken Shoryuken 署名付きURL 動画アップロード イベント送信 ウイルス
スキャン イベント送信 メッセージ送信 動画を取得 ポーリング 動画にタグを付与 ポーリング 動画を取得 変換後の動画をアップロード 動画の変換 S3 SQS Lambda SQS
15 2. 実装の核となる技術
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}%" }
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
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
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}秒"
20 デモ: 実際の変換処理
21 デモ: 実際の変換処理
22 デモ: 実際の変換処理
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
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
25 3. 開発・運用の実際
26 開発環境 services: localstack: image: localstack/localstack environment: - SERVICES=s3,sqs ports:
- "4566:4566" worker: build: . environment: - AWS_ENDPOINT=http://localstack:4566 volumes: - .:/app
27 モニタリング • デッドレターキューの監視 • メッセージの経過時間の監視
28 リソース監視と最適化 CPUは3コアくらいが 適度かな メモリは1.5GiBは 必要そう
29 まとめ
30 実績 いい感じに稼働している!
31 今後の展望 変換処理の最適化
32 今後の展望 変換処理の最適化 パフォーマンスチューニング
33 今後の展望 変換処理の最適化 パフォーマンスチューニング ストリーミング配信への対応
34 まとめ 1. 動画変換システムはRubyで実現可能!
35 まとめ 1. 動画変換システムはRubyで実現可能! 2. バックグラウンドジョブ処理にShoryukenを採用!
36 まとめ 1. 動画変換システムはRubyで実現可能! 2. バックグラウンドジョブ処理にShoryukenを採用! 3. 自前実装とマネージドサービスを組み合わせるとお得!
37 Thank You! Thank You!