← Extractions

Orchestrating Video Transcoding in Ruby (wroclove.rb 2019)

Michal Matyas recounts building a video-transcoding pipeline for a Ruby/Rails media platform, describing the painful evolution from CarrierWave-plus-callbacks to multi-model-per-file to a simple top-to-bottom worker using ffmpeg. The talk delivers nine concrete tips on ffmpeg transcoding (copy streams, optimize for streaming, bring your own args, pick the right download strategy, use presets, pick H.264 profiles, force YUV 4:2:0, collect metadata, trust-but-verify outputs) and ends with a Q&A on ffmpeg vulnerabilities.

Model
claude-opus-4-7
Ingestion
3035c083
Input tokens
437,225
fresh
337,352
cached
92,865
cache write
7,008
Output tokens
15,799
Duration
228.9s
Roundtrips
9
Tool calls
18
Cost
$0.00
Nodes/edges extracted
32 / 57
Read set (nodes/edges)
181 / 2

Nodes (32)

create Docker tool
kind (empty) tool
name (empty) Docker
slug (empty) docker
attrs (empty) {"category" => "platform"}
description (empty) Container platform. Not used in the media platform project because, at the time, Docker was not yet popular and was n...
short_description (empty) Container platform for packaging and running applications.
create YUV 4:2:0 concept
kind (empty) concept
name (empty) YUV 4:2:0
slug (empty) yuv-4-2-0
attrs (empty) {"category" => "format"}
description (empty) Pixel format that should be used for web video because all browsers support it. Other pixel formats (e.g. YUV 4:2:2 p...
short_description (empty) Chroma-subsampled pixel format universally supported by browsers.
create Apple QuickTime tool
kind (empty) tool
name (empty) Apple QuickTime
slug (empty) apple-quicktime
attrs (empty) {"category" => "platform"}
description (empty) Apple media container and framework. The ISO base media format (and thus MP4) is derived from QuickTime. Referenced a...
short_description (empty) Apple's media container, progenitor of the ISO base media format.
create H.264 concept
kind (empty) concept
name (empty) H.264
slug (empty) h-264
attrs (empty) {"category" => "codec"}
description (empty) Video codec featuring named 'profiles' — sets of codec features with varying device support. Higher profiles yield sm...
short_description (empty) Widely-supported video codec with profile-based feature sets.
create MP4 concept
kind (empty) concept
name (empty) MP4
slug (empty) mp4
attrs (empty) {"category" => "format"}
description (empty) MPEG-4 Part 14 container format, based on the ISO base media format which itself derives from Apple's QuickTime. Not ...
short_description (empty) Container format (MPEG-4 Part 14) wrapping video, audio, and metadata.
create WebM concept
kind (empty) concept
name (empty) WebM
slug (empty) webm
attrs (empty) {"category" => "format"}
description (empty) Open container format that was historically required alongside MP4 for cross-browser playback. The talk's team origin...
short_description (empty) Open web video container format, historically needed alongside MP4.
update Orchestrating video transcoding in ruby talk
description Talk at wroclove.rb 2019. wroclove.rb 2019 talk by Michal Matyas (his 4th wroclove.rb, first time speaking). Originally titled 'Transcoding in ...
short_description Talk at wroclove.rb 2019. wroclove.rb 2019 talk on building a Ruby/Rails video-transcoding pipeline with ffmpeg.
update Michal Matyas person
description Conference speaker. Ruby developer; wroclove.rb 2019 speaker who gave 'Orchestrating video transcoding in ruby'. His 4th wroclove.rb atte...
short_description Conference speaker. Ruby developer and wroclove.rb speaker.
create FFmpeg tool
kind (empty) tool
name (empty) FFmpeg
slug (empty) ffmpeg
attrs (empty) {"category" => "tool"}
description (empty) Ubiquitous open-source command-line tool for video/audio transcoding and processing. Used as the transcoding engine t...
short_description (empty) Command-line tool for transcoding and processing audio/video.
create streamio-ffmpeg tool
kind (empty) tool
name (empty) streamio-ffmpeg
slug (empty) streamio-ffmpeg
attrs (empty) {"category" => "library"}
description (empty) Ruby gem wrapping the ffmpeg command line. Offers a custom DSL for transcoding, but the talk recommends ignoring the ...
short_description (empty) Ruby wrapper around ffmpeg with a DSL and progress tracking.
create carrierwave-video tool
kind (empty) tool
name (empty) carrierwave-video
slug (empty) carrierwave-video
attrs (empty) {"category" => "library"}
description (empty) CarrierWave extension that wraps ffmpeg to process video uploads. Used in the MVP and second iterations of the media ...
short_description (empty) CarrierWave extension for transcoding videos with ffmpeg.
create carrierwave_backgrounder tool
kind (empty) tool
name (empty) carrierwave_backgrounder
slug (empty) carrierwave_backgrounder
attrs (empty) {"category" => "library"}
description (empty) Companion gem that lets CarrierWave spawn background workers for processing instead of blocking uploads. Used in the ...
short_description (empty) CarrierWave companion gem that moves processing to background workers.
create Sidekiq tool
kind (empty) tool
name (empty) Sidekiq
slug (empty) sidekiq
attrs (empty) {"category" => "library"}
description (empty) Ruby background job framework. Used in the final rewrite of the media platform to run processing and upload workers o...
short_description (empty) Ruby background job processor backed by Redis.
create AWS Lambda tool
kind (empty) tool
name (empty) AWS Lambda
slug (empty) aws-lambda
attrs (empty) {"category" => "service"}
description (empty) Amazon's FaaS platform. Considered for video transcoding but rejected because of its 15-minute maximum execution time...
short_description (empty) Amazon serverless function-as-a-service platform.
create Zencoder tool
kind (empty) tool
name (empty) Zencoder
slug (empty) zencoder
attrs (empty) {"category" => "service"}
description (empty) Commercial hosted video transcoding service. Evaluated for the media platform but considered too expensive for the ex...
short_description (empty) Hosted cloud video transcoding service.
create Amazon Elastic Transcoder tool
kind (empty) tool
name (empty) Amazon Elastic Transcoder
slug (empty) amazon-elastic-transcoder
attrs (empty) {"category" => "service"}
description (empty) AWS-managed transcoding service. Rejected alongside Zencoder for cost reasons when building a proper media platform a...
short_description (empty) AWS hosted media transcoding service.
create ffprobe tool
kind (empty) tool
name (empty) ffprobe
slug (empty) ffprobe
attrs (empty) {"category" => "tool"}
description (empty) Companion tool shipped with FFmpeg that inspects and reports media file metadata. In some formats duration informatio...
short_description (empty) FFmpeg companion tool that reports media file metadata.
create Avoid Active Record callbacks for media processing takeaway
kind (empty) takeaway
name (empty) Avoid Active Record callbacks for media processing
slug (empty) avoid-active-record-callbacks-for-media-processing
attrs (empty) {"type" => "lesson-learned"}
description (empty) Callbacks make transcoding code hard to reason about and hard to isolate, slowly turning the codebase into a codepend...
short_description (empty) Callbacks turn media processing code into a codependent mess.
create Avoid CarrierWave for non-trivial media processing takeaway
kind (empty) takeaway
name (empty) Avoid CarrierWave for non-trivial media processing
slug (empty) avoid-carrierwave-for-non-trivial-media-processing
attrs (empty) {"type" => "warning"}
description (empty) CarrierWave (and CarrierWave versions/DSL) are fine for simple cases like resizing a thumbnail. For anything more com...
short_description (empty) CarrierWave is fine for thumbnails but breaks down for complex video workflows.
create Prefer a simple top-to-bottom worker takeaway
kind (empty) takeaway
name (empty) Prefer a simple top-to-bottom worker
slug (empty) prefer-a-simple-top-to-bottom-worker
attrs (empty) {"type" => "recommendation"}
description (empty) The simplest solution is often the best. The team avoided a lot of pain once they stopped doing things 'the Rails way...
short_description (empty) A plain processing worker beats gem-slapping and Rails callbacks.
create Hindsight is 20/20 — don't judge past code takeaway
kind (empty) takeaway
name (empty) Hindsight is 20/20 — don't judge past code
slug (empty) hindsight-is-20-20-don-t-judge-past-code
attrs (empty) {"type" => "insight"}
description (empty) It's easy to look at old code and ask how it ever shipped, but the knowledge and experience needed to do better are u...
short_description (empty) Don't judge old code or other developers harshly; experience is earned over time.
create Copy streams when transcoding takeaway
kind (empty) takeaway
name (empty) Copy streams when transcoding
slug (empty) copy-streams-when-transcoding
attrs (empty) {"type" => "recommendation"}
description (empty) When producing multiple variants of a video that share characteristics (e.g. identical audio across different resolut...
short_description (empty) Copy unchanged streams (e.g. audio) across variants instead of re-encoding.
create Optimize MP4 for streaming with faststart takeaway
kind (empty) takeaway
name (empty) Optimize MP4 for streaming with faststart
slug (empty) optimize-mp4-for-streaming-with-faststart
attrs (empty) {"type" => "recommendation"}
description (empty) By default ffmpeg writes MP4 metadata at the end of the file in a single pass. Use the movflags/faststart flags so ff...
short_description (empty) Use ffmpeg flags that move MP4 metadata to the front of the file.
create Bring your own ffmpeg arguments takeaway
kind (empty) takeaway
name (empty) Bring your own ffmpeg arguments
slug (empty) bring-your-own-ffmpeg-arguments
attrs (empty) {"type" => "recommendation"}
description (empty) Libraries like streamio-ffmpeg ship a DSL for transcoding, but the talk recommends ignoring it and passing custom ffm...
short_description (empty) Bypass library DSLs and pass custom ffmpeg args for control.
create Download first vs transcode from URL is not universal takeaway
kind (empty) takeaway
name (empty) Download first vs transcode from URL is not universal
slug (empty) download-first-vs-transcode-from-url-is-not-universal
attrs (empty) {"type" => "warning"}
description (empty) ffmpeg can transcode from a URL (downloading only what it needs), which is theoretically faster than download-then-tr...
short_description (empty) URL-based ffmpeg transcoding can be 50× slower for some inputs.
create Use ffmpeg presets takeaway
kind (empty) takeaway
name (empty) Use ffmpeg presets
slug (empty) use-ffmpeg-presets
attrs (empty) {"type" => "recommendation"}
description (empty) ffmpeg ships presets from ultrafast to ultraslow covering common configurations. Use fast presets for the lowest-reso...
short_description (empty) Offload encoder tuning to ffmpeg's ultrafast…ultraslow presets.
create Pick the highest H.264 profile you can afford takeaway
kind (empty) takeaway
name (empty) Pick the highest H.264 profile you can afford
slug (empty) pick-the-highest-h-264-profile-you-can-afford
attrs (empty) {"type" => "recommendation"}
description (empty) H.264 profiles are feature sets; higher profiles give smaller, better-looking videos but reduce device support. Pick ...
short_description (empty) Higher H.264 profiles mean smaller/better videos but fewer compatible devices.
create Always output YUV 4:2:0 takeaway
kind (empty) takeaway
name (empty) Always output YUV 4:2:0
slug (empty) always-output-yuv-4-2-0
attrs (empty) {"type" => "recommendation"}
description (empty) All browsers support the YUV 4:2:0 pixel format. Other pixel formats (e.g. YUV 4:2:2 coming from Apple QuickTime hand...
short_description (empty) Force YUV 4:2:0 so every browser plays the video.
create Collect as much video metadata as you can takeaway
kind (empty) takeaway
name (empty) Collect as much video metadata as you can
slug (empty) collect-as-much-video-metadata-as-you-can
attrs (empty) {"type" => "recommendation"}
description (empty) Persist every scrap of metadata you can get from both input videos and every output variant. This makes it possible t...
short_description (empty) Grab metadata from every input and output to enable cross-analysis.
create Trust but verify ffmpeg output takeaway
kind (empty) takeaway
name (empty) Trust but verify ffmpeg output
slug (empty) trust-but-verify-ffmpeg-output
attrs (empty) {"type" => "recommendation"}
description (empty) ffmpeg can report success while producing a cut/incomplete file that is still technically valid. Validate outputs — f...
short_description (empty) ffmpeg can lie; validate output files (but beware ffprobe duration guesses).
create Isolate ffmpeg due to its vulnerability history takeaway
kind (empty) takeaway
name (empty) Isolate ffmpeg due to its vulnerability history
slug (empty) isolate-ffmpeg-due-to-its-vulnerability-history
attrs (empty) {"type" => "recommendation"}
description (empty) ffmpeg has a documented history of vulnerabilities that can compromise the host server. When rebuilding the system to...
short_description (empty) Sandbox ffmpeg because it has had server-compromising CVEs.
create Protecting against ffmpeg vulnerabilities question
kind (empty) question
name (empty) Protecting against ffmpeg vulnerabilities
slug (empty) protecting-against-ffmpeg-vulnerabilities
attrs (empty) {"answer_summary" => "They didn't at the time (trusted input); today he would sandbox ffmpeg and deny it access to th...
description (empty) Audience question after the talk: how did/would the speaker protect the system against ffmpeg vulnerabilities? Answer...
short_description (empty) How do you protect against vulnerabilities in ffmpeg?

Edges (57)

create Michal MatyasusesAmazon S3
context (empty) Final pipeline uploaded all derivatives to S3.
relation (empty) uses
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) 594c0c6b-0a58-4e01-91ef-f4185be0190f
create Michal MatyasusesCarrierWave
context (empty) Used CarrierWave (and carrierwave-video/backgrounder) in early iterations.
relation (empty) uses
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) e67c4ddf-6686-464e-a1f7-e6eb5823e969
create MP4related_toApple QuickTime
context (empty) MP4 is based on the ISO base media format, which derives from QuickTime.
relation (empty) related_to
source_node_id (empty) 1dafa315-659a-4835-ab37-a527881d0a92
target_node_id (empty) 7ba408af-4c30-4d3f-9fd4-d3daff12b1c2
update Michal MatyasauthoredOrchestrating video transcoding in ruby
context (empty) Speaker and author of the wroclove.rb 2019 talk.
update Orchestrating video transcoding in rubypresented_atwroclove.rb 2019
context (empty) Delivered at wroclove.rb 2019.
create Michal Matyasattendedwroclove.rb 2019
context (empty) Speaker at the 2019 edition; his 4th wroclove.rb overall.
relation (empty) attended
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) 8bcc988a-785d-4dfa-a063-1daa7ba349c0
create Orchestrating video transcoding in rubyaboutFFmpeg
context (empty) The pipeline uses ffmpeg as the transcoding engine; most tips are ffmpeg-specific.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Orchestrating video transcoding in rubyaboutstreamio-ffmpeg
context (empty) Final iteration uses streamio-ffmpeg with custom args, mainly for progress tracking.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) ad0304a0-9d5d-47c3-9466-85f65d6d0e36
create Orchestrating video transcoding in rubyaboutCarrierWave
context (empty) The MVP and second iteration used CarrierWave and hit its limits.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) e67c4ddf-6686-464e-a1f7-e6eb5823e969
create Orchestrating video transcoding in rubyaboutcarrierwave-video
context (empty) Used in the MVP for video processing via ffmpeg.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) d035b4c2-e622-4e40-b0cf-f93ee9458cb8
create Orchestrating video transcoding in rubyaboutcarrierwave_backgrounder
context (empty) Used in the MVP to run transcoding in background workers.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) dfe8c4f6-7474-4056-af0e-1853a592a51f
create Orchestrating video transcoding in rubyaboutSidekiq
context (empty) Final pipeline uses Sidekiq with distinct queues for processing and S3 uploads.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 2365c22d-c83e-4553-b865-ec22d0b5b225
create Orchestrating video transcoding in rubyaboutAmazon S3
context (empty) Final rewrite uploads all derivatives to S3 on a dedicated upload queue.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 594c0c6b-0a58-4e01-91ef-f4185be0190f
create Orchestrating video transcoding in rubyaboutAWS Lambda
context (empty) Considered and rejected due to 15-minute execution limit.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) d11fe053-58e7-42b9-9353-57fa0e9c8aa3
create Orchestrating video transcoding in rubyaboutZencoder
context (empty) Considered and rejected due to cost for a full media platform.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) e44ee100-8e63-40d5-81a6-6d89a43dedbf
create Orchestrating video transcoding in rubyaboutAmazon Elastic Transcoder
context (empty) Considered and rejected due to cost.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) b76a9706-f611-49d5-ba96-bc8b9c0bc47a
create Orchestrating video transcoding in rubyaboutDocker
context (empty) Not used because at the time Docker wasn't production-ready/popular.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) f4375c6b-4dbe-421e-bf0a-fe1240fd8152
create Orchestrating video transcoding in rubyaboutMP4
context (empty) Deep dive into MP4 as a container format and its metadata structure.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 1dafa315-659a-4835-ab37-a527881d0a92
create Orchestrating video transcoding in rubyaboutWebM
context (empty) Initially transcoded alongside MP4; dropped as browser MP4 support improved.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 9e844740-1a7f-45eb-9aae-cfdb1e7db169
create Orchestrating video transcoding in rubyaboutH.264
context (empty) Tip on choosing H.264 profiles for compatibility vs quality.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 45316b8e-c475-4560-950f-72f038d8266d
create Orchestrating video transcoding in rubyaboutYUV 4:2:0
context (empty) Always convert to YUV 4:2:0 to avoid browser playback bugs.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 17c04c3c-0e18-4956-b905-6fcb98ff117d
create Orchestrating video transcoding in rubyaboutApple QuickTime
context (empty) ISO base media / MP4 originate from QuickTime; hand-camera QuickTime input triggered a pixel-format bug.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 7ba408af-4c30-4d3f-9fd4-d3daff12b1c2
create Orchestrating video transcoding in rubyaboutffprobe
context (empty) Mentioned when describing duration-approximation pitfalls during output validation.
relation (empty) about
source_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
target_node_id (empty) 800cbe99-2706-4910-bdde-e43e72870e19
create Avoid Active Record callbacks for media processingfrom_talkOrchestrating video transcoding in ruby
context (empty) Lesson drawn from the MVP's callback-driven design.
relation (empty) from_talk
source_node_id (empty) e4b3b468-9c19-44ba-af31-d79710d7e129
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Avoid CarrierWave for non-trivial media processingfrom_talkOrchestrating video transcoding in ruby
context (empty) Lesson from hitting CarrierWave's limits on version-based transcoding.
relation (empty) from_talk
source_node_id (empty) 5fb1daed-fc93-40d6-bfda-d2daabf04517
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Prefer a simple top-to-bottom workerfrom_talkOrchestrating video transcoding in ruby
context (empty) Main architectural lesson from the final rewrite.
relation (empty) from_talk
source_node_id (empty) 14c86ad1-d2f9-4f32-a8c0-505e30817609
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Hindsight is 20/20 — don't judge past codefrom_talkOrchestrating video transcoding in ruby
context (empty) Explicit 'lesson number one' in the talk.
relation (empty) from_talk
source_node_id (empty) 656f8d59-8a89-4438-a4c4-68c298f33aea
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Copy streams when transcodingfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #1 on transcoding.
relation (empty) from_talk
source_node_id (empty) ca6e5acb-235e-402c-941b-7cf1377fcf3d
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Optimize MP4 for streaming with faststartfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #2: move MP4 metadata to the front of the file.
relation (empty) from_talk
source_node_id (empty) b2b7a6e2-5557-49d5-93b5-85c9eff2d9ca
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Bring your own ffmpeg argumentsfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #3: pass custom args instead of using streamio-ffmpeg's DSL.
relation (empty) from_talk
source_node_id (empty) 3ec6cd8c-d6d2-4a05-9f08-6e350f04f35a
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Download first vs transcode from URL is not universalfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #4: no universal solution; URL transcoding can be 50× slower.
relation (empty) from_talk
source_node_id (empty) ceca549b-eb87-4a31-8e49-4d40d67ad1e5
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Use ffmpeg presetsfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #5: use presets; also mentions parallel-chunk transcoding.
relation (empty) from_talk
source_node_id (empty) a795a160-6ba3-4dda-974a-05856b204f17
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Pick the highest H.264 profile you can affordfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #6 on profiles.
relation (empty) from_talk
source_node_id (empty) 1414f8e5-8b6e-4b09-8f1c-6af762eeacbb
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Always output YUV 4:2:0from_talkOrchestrating video transcoding in ruby
context (empty) Tip #7 on pixel format compatibility.
relation (empty) from_talk
source_node_id (empty) c72e77e9-5714-4a28-bf6e-af6f9d406eaf
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Collect as much video metadata as you canfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #8 on collecting metadata for diagnostics.
relation (empty) from_talk
source_node_id (empty) 85d2b057-6e8a-4a49-931e-9490feaaa760
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Trust but verify ffmpeg outputfrom_talkOrchestrating video transcoding in ruby
context (empty) Tip #9 on validating ffmpeg output.
relation (empty) from_talk
source_node_id (empty) ca138028-e204-424c-809f-d59534e882da
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Isolate ffmpeg due to its vulnerability historyfrom_talkOrchestrating video transcoding in ruby
context (empty) Recommendation drawn from the Q&A on ffmpeg vulnerabilities.
relation (empty) from_talk
source_node_id (empty) 2d2136c5-450d-4421-8585-b829ddb839c8
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Protecting against ffmpeg vulnerabilitiesasked_atOrchestrating video transcoding in ruby
context (empty) Audience Q&A after the talk.
relation (empty) asked_at
source_node_id (empty) 93f60c6b-5777-499d-9f36-33de63d834b1
target_node_id (empty) e2397afa-4e80-4f66-b055-9dc2e00155b7
create Protecting against ffmpeg vulnerabilitiesaboutFFmpeg
context (empty) Question concerns security of the ffmpeg process.
relation (empty) about
source_node_id (empty) 93f60c6b-5777-499d-9f36-33de63d834b1
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Copy streams when transcodingaboutFFmpeg
context (empty) Tip applies to ffmpeg stream copy.
relation (empty) about
source_node_id (empty) ca6e5acb-235e-402c-941b-7cf1377fcf3d
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Optimize MP4 for streaming with faststartaboutMP4
context (empty) Faststart moves MP4 metadata to the front of the file.
relation (empty) about
source_node_id (empty) b2b7a6e2-5557-49d5-93b5-85c9eff2d9ca
target_node_id (empty) 1dafa315-659a-4835-ab37-a527881d0a92
create Optimize MP4 for streaming with faststartaboutFFmpeg
context (empty) Implemented via ffmpeg flags.
relation (empty) about
source_node_id (empty) b2b7a6e2-5557-49d5-93b5-85c9eff2d9ca
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Bring your own ffmpeg argumentsaboutstreamio-ffmpeg
context (empty) Recommendation to bypass streamio-ffmpeg's DSL.
relation (empty) about
source_node_id (empty) 3ec6cd8c-d6d2-4a05-9f08-6e350f04f35a
target_node_id (empty) ad0304a0-9d5d-47c3-9466-85f65d6d0e36
create Use ffmpeg presetsaboutFFmpeg
context (empty) Concerns ffmpeg's ultrafast…ultraslow presets.
relation (empty) about
source_node_id (empty) a795a160-6ba3-4dda-974a-05856b204f17
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Pick the highest H.264 profile you can affordaboutH.264
context (empty) About H.264 profile selection.
relation (empty) about
source_node_id (empty) 1414f8e5-8b6e-4b09-8f1c-6af762eeacbb
target_node_id (empty) 45316b8e-c475-4560-950f-72f038d8266d
create Always output YUV 4:2:0aboutYUV 4:2:0
context (empty) Directly about the YUV 4:2:0 pixel format.
relation (empty) about
source_node_id (empty) c72e77e9-5714-4a28-bf6e-af6f9d406eaf
target_node_id (empty) 17c04c3c-0e18-4956-b905-6fcb98ff117d
create Trust but verify ffmpeg outputaboutffprobe
context (empty) Discusses ffprobe's duration approximation and false positives.
relation (empty) about
source_node_id (empty) ca138028-e204-424c-809f-d59534e882da
target_node_id (empty) 800cbe99-2706-4910-bdde-e43e72870e19
create Isolate ffmpeg due to its vulnerability historyaboutFFmpeg
context (empty) Security recommendation for running ffmpeg.
relation (empty) about
source_node_id (empty) 2d2136c5-450d-4421-8585-b829ddb839c8
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Michal Matyashas_skillRuby on Rails
attrs (empty) {"level" => "intermediate"}
context (empty) Worked as a Rails developer on the media-platform project.
relation (empty) has_skill
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Michal MatyasusesFFmpeg
context (empty) Used ffmpeg as the transcoding engine on the media platform.
relation (empty) uses
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create Michal Matyasusesstreamio-ffmpeg
context (empty) Used streamio-ffmpeg in the final rewrite for its progress tracking.
relation (empty) uses
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) ad0304a0-9d5d-47c3-9466-85f65d6d0e36
create Michal MatyasusesSidekiq
context (empty) Used Sidekiq with separate queues for processing and uploads.
relation (empty) uses
source_node_id (empty) 4a70c303-c4d2-4d05-ae5c-b9c6dcb647aa
target_node_id (empty) 2365c22d-c83e-4553-b865-ec22d0b5b225
create ffproberelated_toFFmpeg
context (empty) ffprobe ships as part of the ffmpeg project.
relation (empty) related_to
source_node_id (empty) 800cbe99-2706-4910-bdde-e43e72870e19
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create streamio-ffmpegusesFFmpeg
context (empty) streamio-ffmpeg wraps the ffmpeg command line.
relation (empty) uses
source_node_id (empty) ad0304a0-9d5d-47c3-9466-85f65d6d0e36
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create carrierwave-videousesFFmpeg
context (empty) carrierwave-video shells out to ffmpeg to transcode.
relation (empty) uses
source_node_id (empty) d035b4c2-e622-4e40-b0cf-f93ee9458cb8
target_node_id (empty) 147f436f-cb75-4322-bf7f-7800099bf534
create carrierwave-videorelated_toCarrierWave
context (empty) Extension built on top of CarrierWave.
relation (empty) related_to
source_node_id (empty) d035b4c2-e622-4e40-b0cf-f93ee9458cb8
target_node_id (empty) e67c4ddf-6686-464e-a1f7-e6eb5823e969
create carrierwave_backgrounderrelated_toCarrierWave
context (empty) Companion gem to CarrierWave enabling background processing.
relation (empty) related_to
source_node_id (empty) dfe8c4f6-7474-4056-af0e-1853a592a51f
target_node_id (empty) e67c4ddf-6686-464e-a1f7-e6eb5823e969

Read set

181 nodes

event EmberConf list_nodes_by_kind event KanDDDinsky list_nodes_by_kind event wroclove.rb 2018 list_nodes_by_kind event wroclove.rb 2019 list_nodes_by_kind event wroclove.rb 2022 list_nodes_by_kind event wroclove.rb 2023 list_nodes_by_kind event wroclove.rb 2024 list_nodes_by_kind event wroclove.rb 2025 list_nodes_by_kind event wroclove.rb 2026 list_nodes_by_kind tool Abbrev list_nodes_by_kind tool Action Cable list_nodes_by_kind+search_nodes tool Active Storage list_nodes_by_kind+search_nodes tool acts_as_api list_nodes_by_kind tool aggregate_root list_nodes_by_kind+search_nodes tool Akamai list_nodes_by_kind tool Amazon S3 list_nodes_by_kind+search_nodes tool Angular list_nodes_by_kind tool Apache HTTP Server list_nodes_by_kind tool Apache Kafka list_nodes_by_kind tool async list_nodes_by_kind tool Babel list_nodes_by_kind+search_nodes tool BME280 list_nodes_by_kind tool Brotli list_nodes_by_kind+search_nodes tool Browserslist list_nodes_by_kind tool C++ list_nodes_by_kind tool CarrierWave list_nodes_by_kind+search_nodes tool Cassandra list_nodes_by_kind tool Cells list_nodes_by_kind tool Celluloid list_nodes_by_kind+search_nodes tool Clojure list_nodes_by_kind tool ClojureScript list_nodes_by_kind tool Crystal list_nodes_by_kind tool curses list_nodes_by_kind tool DBM / SDBM / GDBM list_nodes_by_kind tool Devise list_nodes_by_kind tool Discourse list_nodes_by_kind tool Distributed Ruby list_nodes_by_kind tool dry-container list_nodes_by_kind+search_nodes tool dry-struct list_nodes_by_kind tool dry-types list_nodes_by_kind tool dry-validation list_nodes_by_kind tool Elasticsearch list_nodes_by_kind tool Electron list_nodes_by_kind tool Elixir list_nodes_by_kind tool Elm list_nodes_by_kind tool Ember.js list_nodes_by_kind tool Entity Store list_nodes_by_kind tool Erlang list_nodes_by_kind tool ESP32 list_nodes_by_kind tool ESP-IDF list_nodes_by_kind tool Ethereum list_nodes_by_kind+search_nodes tool EventMachine list_nodes_by_kind tool Faker list_nodes_by_kind tool file (Unix command) list_nodes_by_kind tool find-slow script list_nodes_by_kind tool flag_shih_tzu list_nodes_by_kind tool Flow list_nodes_by_kind tool FreeRTOS list_nodes_by_kind tool git bisect list_nodes_by_kind tool Glimmer list_nodes_by_kind tool Go list_nodes_by_kind tool Grafana list_nodes_by_kind tool GraphQL list_nodes_by_kind tool gRPC list_nodes_by_kind tool Guard list_nodes_by_kind tool gzip list_nodes_by_kind+search_nodes tool Hanami list_nodes_by_kind tool heapy list_nodes_by_kind+search_nodes tool Heckle list_nodes_by_kind tool Heroku list_nodes_by_kind+search_nodes tool HTTP/2 list_nodes_by_kind+search_nodes tool ImageMagick list_nodes_by_kind+search_nodes tool image_processing gem list_nodes_by_kind+search_nodes tool interactor list_nodes_by_kind+search_nodes tool Iodine list_nodes_by_kind tool Java list_nodes_by_kind tool JIRA list_nodes_by_kind tool JSON API Resources list_nodes_by_kind tool libvips list_nodes_by_kind+search_nodes tool Matrix (Ruby stdlib) list_nodes_by_kind tool methods gem list_nodes_by_kind tool mini_magick list_nodes_by_kind+search_nodes tool MinIO list_nodes_by_kind+search_nodes tool minitest list_nodes_by_kind tool MobX list_nodes_by_kind tool mruby list_nodes_by_kind tool Mutant list_nodes_by_kind tool .NET list_nodes_by_kind+search_nodes tool nginx list_nodes_by_kind tool Node.js list_nodes_by_kind+search_nodes tool Opal list_nodes_by_kind+search_nodes tool OptionParser list_nodes_by_kind tool Outlook list_nodes_by_kind tool Paperclip list_nodes_by_kind+search_nodes tool Perl list_nodes_by_kind tool Phoenix list_nodes_by_kind tool Plezi list_nodes_by_kind tool PostgreSQL list_nodes_by_kind tool power_assert list_nodes_by_kind tool Preact list_nodes_by_kind tool Prime (Ruby stdlib) list_nodes_by_kind tool Prometheus list_nodes_by_kind tool Protocol Buffers list_nodes_by_kind tool PStore list_nodes_by_kind tool Puma list_nodes_by_kind tool PureScript list_nodes_by_kind tool QEMU list_nodes_by_kind tool Rack list_nodes_by_kind tool Rails 5.2 list_nodes_by_kind tool rails_event_store list_nodes_by_kind+search_nodes tool React list_nodes_by_kind tool RealtimeBoard list_nodes_by_kind tool Redis list_nodes_by_kind tool Redmine list_nodes_by_kind tool Refile list_nodes_by_kind+search_nodes tool Reform list_nodes_by_kind tool RSpec list_nodes_by_kind tool Ruby list_nodes_by_kind tool Ruby Browser Detection Gem list_nodes_by_kind tool ruby-contracts list_nodes_by_kind tool Ruby Event Store list_nodes_by_kind+search_nodes tool Ruby on Rails list_nodes_by_kind tool Rust list_nodes_by_kind tool Sequel list_nodes_by_kind tool Shrine list_nodes_by_kind tool Sonic Pi list_nodes_by_kind tool Spring list_nodes_by_kind tool Stimulus list_nodes_by_kind tool Sync Space VR list_nodes_by_kind tool ThingSpeak list_nodes_by_kind tool Trailblazer list_nodes_by_kind tool TruffleRuby list_nodes_by_kind tool TSort list_nodes_by_kind tool TypeScript list_nodes_by_kind tool Tyrant list_nodes_by_kind tool Uppy list_nodes_by_kind+search_nodes tool WebP list_nodes_by_kind+search_nodes tool webpagetest.org list_nodes_by_kind+search_nodes tool Wolfram Language list_nodes_by_kind company Transloadit search_nodes talk Orchestrating video transcoding in ruby search_nodes+get_node_edges project imageflow search_nodes takeaway Prefer libvips over ImageMagick search_nodes question VNC↔WebSocket frame translation search_nodes question Adding imageflow to image_processing gem search_nodes talk Handling file uploads for modern developer search_nodes talk Under The Hood And On The Surface Of Sidekiq search_nodes concept Trailblazer Workflow search_nodes talk UringMachine — High Performance Concurrency for Ruby Using io_uring search_nodes project AnyCable search_nodes concept Rails Reload-Safe ES Configuration search_nodes takeaway Sign serverlessforruby.org petition search_nodes resource serverlessforruby.org Petition search_nodes concept Function as a Service search_nodes concept Serverless search_nodes talk FaaS for Ruby Lightning Talk search_nodes concept Direct Upload to Cloud search_nodes question Local storage for tests search_nodes resource Rocket Real-Time Benchmark search_nodes concept On-Upload Processing search_nodes takeaway Switch on HTTP/2 search_nodes question Isn't the dry-container recipe global state? search_nodes talk Kamal is not harder than your PaaS search_nodes concept Zero-Disconnect Deployment search_nodes concept Context Map search_nodes concept kqueue search_nodes concept WebAssembly search_nodes concept Magic bytes MIME detection search_nodes takeaway Watch WebAssembly for real performance wins search_nodes person Michal Matyas search_nodes person Mateusz Nowak search_nodes person Miron Marczuk search_nodes person Maciej Rząsa search_nodes person Yatish Mehta search_nodes person Michał Zajączkowski de Mezer search_nodes person Matz search_nodes person Michał Młoźniak search_nodes person Agnieszka Małaszkiewicz search_nodes talk Events events events search_nodes concept tus protocol search_nodes project ManageIQ search_nodes

2 edges