Making UHD Blu-ray video discs at home and on the cheap

I charge reasonable rates to make UHD or FHD Blu-ray discs for your video project. Email me at mail(a)benmacphail.ca for more info. If you want to learn how to make them yourself, read on!

For our supporters on the Chicken Surprise Indiegogo campaign who chose a perk including Blu-rays, I had to find a way to make UHD Blu-ray discs at home, and on the cheap. After much trial and error, I came to a process that produces UHD or FHD Blu-ray discs that can be played on commercial disc players. Here’s that process, and how you can replicate it.

First, let’s be realistic about costs here. The costs associated with producing physical media are going up every year, as scales of production lower. The process outlined in this guide also uses some commercial software that costs some money. As of writing, you can expect to spend around $250 CAD upfront on non-consumables (the Blu-ray writer and software, not including the computer you need to run them), and $1-3 CAD per disc.

This guide requires that you have access to both a Windows computer AND a computer running either Ubuntu Linux or macOS. It also assumes you have a basic familiarity with the command line on that Ubuntu/macOS system.

Mac users who do not have access to a Windows machine: all of the tools I talk about here may run fine on a VPS from the likes of AWS, Azure, or your provider of choice; though I have not tested this. You may also want to give UTM a try, which can run Windows on any Mac with decent performance.

This guide also does NOT walk you through the process of creating menus for your Blu-ray disc, nor the process of including more than one video on your disc. However, the same tools we use are capable of doing these things, so go forth and experiment (though I recommend following the guide once through first, to validate that your setup works in the same way mine does).

This guide also specifically pertains to SDR (Standard Dynamic Range) content, as opposed to HDR (High Dynamic Range) content. HDR is still an absolute mess is 2023 and I do not intend to update this guide with any information on it.

The process is similar for both 1080p and 4K Blu-rays, but I’ve noted where the process diverges.

This guide comes with no guarantee of results whatsoever. I was frustrated that no guide of this sort exists elsewhere on the internet, so this is my best attempt at writing one. Don’t call me responsible if by employing any of the information in this guide, your computer explodes, thermonuclear war erupts, the daisies in your front yard wilt, you hurt your pinky finger trying to type a command, etc.

This guide is released under a WTFPL license, version 2.

I’ve linked some useful resources at the bottom of the page. There are probably easier/cheaper ways to generate Blu-ray discs (especially the 1080p flavour, with old tools like Adobe Encore CS6), but this is what I was able to figure out with my skill set and budget.

The basic steps are:

  • to assemble your audio, video, menu, subtitle tracks individually
  • assemble those tracks into a Blu-ray data structure
  • wrap those data structures in a file system image suitable for a Blu-ray disc
  • burn the file system image to a compatible disc

What does the data structure for a Blu-ray disc look like?

A Blu-ray disc must be burned with a UDF 2.50 filesystem on a compatible disc.

On that filesystem, you must have two folders called “CERTIFICATE” and “BDMV”. For our purposes, the CERTIFICATE folder can be empty. The BDMV folder contains our data tracks, plus metadata, in a particular arrangement of subfolders. For the purposes of this guide, it’s not necessary to know how the data is arranged within those subfolders.

A clarification on terminology

Please indulge me for a moment on a brief tangent. If you’re a post-production professional, you should already know this stuff.

In the digital world, there is a difference between media containers, and media streams (or “tracks”).

A media container (such as a file ending in .MOV, .MP4, .MKV, or .AVI) is a file containing one or more media streams.

A media stream is the raw data produced by a given encoder program.

Media is typically distributed in a container with multiple streams. But a stream can also exist in its own file.

For example: a .MOV container file might contain a video stream produced by a H.264 encoder, and also an audio stream produced by an AAC encoder.

Another example: another .MOV container file might contain a video stream produced by a Cineform encoder, a second video stream produced by a Prores encoder, an audio stream produced by a PCM encoder, and a subtitle stream produced by a SRT encoder.

The first example is something you might get out of a cell phone camera; one audio stream and one video stream. The second example is a possibly impractical application of putting many streams of different or similar types into one container file.

.MOV is just one container that happens to be widely used, because it can contain a very wide variety of stream types. Some other containers, such as .MP4, are particular about the types of streams they can contain.

Note that the file name extension is just an easy indicator of the container used. You can change the name of a .MOV file to end in .MP4, and most media players will figure out the discrepancy and still play it, but it is no less still a .MOV file. You can check the true container of a file with MediaInfo or ffprobe.

There are pieces of software that specifically create streams (“encoders”), and other software that specifically create containers (“muxers”).

Commonly, these two functions are combined, which is where the marketing can get fuzzy (Adobe Media Encoder, a common tool in the professional video industry, is both an encoder and a muxer). But for the purposes of this guide, the two processes are distinct, and occur in different steps.

Crucially, we will be producing streams that our Blu-ray compilation program (BD Wizard) will mux for us into containers.

Things you will need

  • Compatible BD-R discs.
    • 25GB and 50GB discs are suitable for HD Blu-ray.
    • 50GB, 66GB, and 100GB discs are suitable for UHD Blu-ray.
  • A Blu-ray disc writer.
  • DVDLogic BD Wizard on a Windows PC.
    • The yearly subscription is relatively affordable. The developer also offers a 30-day free trial.
  • ImgBurn on the Windows PC.
  • (if you want your Blu-ray to have a subtitle track) easySUP.
  • On a Linux or macOS (virtual) machine: Command line binaries of ffmpeg, (if targeting HD Blu-ray) x264, and (if targeting UHD Blu-ray) x265, in your system’s PATH.
    • I was unable to find binaries for Windows that worked for these tasks (the builds I did find online or that I compiled myself tended to stall at around frame 400 of the transcoding job, for reasons I never identified). I found that Ubuntu’s package repos had versions that worked, as did Homebrew on Mac. If you don’t already have a Mac or Ubuntu Linux machine, I recommend loading the latest version of the Ubuntu live image onto a USB drive, booting your PC off it, and running ffmpeg, x264, and x265 with that. WSL2 or other VM solutions such as VirtualBox that run on Windows also work, but I found on my PC that using a VM levied a performance penalty of around 85% when running x265 compared to running on bare metal. Your experience may vary.
    • To install ffmpeg, x264, and x265 on a Mac with Homebrew installed, run this command: brew install ffmpeg x264 x265
    • To install ffmpeg, x264, and x265 on Ubuntu Linux, run this command and follow the prompts: sudo apt install ffmpeg x264 x265

Preparing your input video and audio tracks

Export your film to the following formats:

  • (if targeting HD Blu-ray) Your film’s video in any format that ffmpeg can decode (I recommend Cineform in a .MOV container, but most common file types should work) at 1920x1080. The frame format should be progressive. Blu-ray supports most common frame rates.
  • (if targeting UHD Blu-ray) Your film’s video in any format that ffmpeg can decode (I recommend Cineform in a .MOV container, but most common file types should work) at 3840x2160. The frame format should be progressive. Blu-ray supports most common frame rates.
  • Your film’s audio, in a stereo PCM .wav file, at 16 bit / 48KHz.
  • If applicable, individual subtitle tracks in SRT format.
    • If you need to convert from another format to SRT, I recommend Subtitle Edit. How to use Subtitle Edit is outside the scope of this guide.

Encoding the video stream

Transcode the video file into a Blu-ray compatible stream on your Linux or macOS computer:

  • (if targeting HD Blu-ray):

    • Run this command in a terminal, substituting Source.mov and Output.264 with your input and output videos, respectively:

      • ffmpeg -i Source.mov -r 24000/1001 -pix_fmt yuv420p -f rawvideo - | x264 --bitrate 30000 --tune film --bluray-compat --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --open-gop --slices 4 --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 --b-pyramid none --preset medium -r 24000/1001 --pass 1 -o Output.264 -
      • Options you can tweak here:
        • --fps, -r, and keyint: This is the frame rate of your video. 24000/1001 is appropriate if your frame rate is 23.976. Keep these options in sync.
        • --bitrate: This is your output video’s bitrate in kilobits per second. You might want to decrease this if your video is especially long, and the resulting video is too large to fit on your disc type. Otherwise 30000 is fine.
    • You should now see Output.264 in your output directory. Check it with a media player (I recommend mpv for this task) to make sure it looks right. You should expect to see your video playing at the correct speed without any distortion. I recommend playing through at least a full minute of video to ensure there are no intermittent encoding errors.

    • Then run the command again! Replace --pass 1 with --pass 2. We’re doing two-pass encoding, which results in higher quality.

      • It’s normal for the second encoding pass to be slower than the first.

      • Tip: you can run both passes sequentially by putting an && separator in between the commands for the passes. Like this:

        • ffmpeg -i Source.mov -r 24000/1001 -pix_fmt yuv420p -f rawvideo - | x264 --bitrate 30000 --tune film --bluray-compat --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --open-gop --slices 4 --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 --b-pyramid none --preset medium -r 24000/1001 --pass 1 -o Output.264 - && ffmpeg -i Source.mov -r 24000/1001 -pix_fmt yuv420p -f rawvideo - | x264 --bitrate 30000 --tune film --bluray-compat --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --open-gop --slices 4 --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 --b-pyramid none --preset medium -r 24000/1001 --pass 2 -o Output.264 -
  • (if targeting UHD Blu-ray) Run this command, substituting Source.mov and Output.265 with your input and output videos, respectively.

    • ffmpeg -i Source.mov -r 24000/1001 -pix_fmt yuv420p -f rawvideo - | x265 --input - --input-res 3840x2160 --no-info --uhd-bd --repeat-headers --profile main444-10 --no-open-gop --no-b-pyramid --keyint 24 --min-keyint 1 --fps 24000/1001 --bitrate 50000 --vbv-maxrate 75000 --vbv-bufsize 75000 --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --output Output.265
      • Options you can tweak here:
        • --fps, -r, and keyint: This is the frame rate of your video. 24000/1001 is appropriate if your frame rate is 23.976. If 24, replace these values with 24. Change these three values together.
        • --bitrate: This is the target bitrate in kilobits per second. We’re using VBR encoding, so this is merely a target for the average bitrate of the file. This should be as high as possible without (a) getting too close to the maximum read rate of 92Mbps for 50GB discs, or 144Mbps for higher capacity disks, or (b) making a file larger than the capacity of your disc. If you get “buffer underflow” errors from BD Wizard when compiling the disc’s files, your bitrate or peak bitrate (described below) are probably too high. I found that 50000 (50 Mbps) is already practically indistinguishable from lossless for SDR content, so no need to push it to the max.
        • --vbv-maxrate: The peak allowable bitrate for the file. Again, should not get too close to the maximum read rate for the disc. The theoretical maximum minus 20% should be fine in my experience. I used 75000 (75Mbps) on Chicken Surprise, which worked well.
        • --vbv-bufsize: According to the BD Wizard developer, this should ideally be 140% of the target bitrate, but no larger than the peak bitrate.
      • You can expect this to take 15-30 minutes for processing per minute of video depending on the speed of your computer, and it will monopolize your computer’s CPU resources in the meantime, so plan accordingly.
      • After processing is complete, you should see Output.265 in your output directory. Check it with a media player (I recommend mpv for this task) to make sure it looks right. You should expect to see your video playing at the correct speed without any distortion. I recommend playing through at least a full minute of video to ensure there are no intermittent encoding errors.

Encoding the subtitle track (if your movie has subtitles)

Convert your subtitle track into the Blu-ray SUP format with easySUP.

  • Open easySUP. Click the “Subtitle file” field, and select the .SRT file containing your subtitle track.
  • In the right side of the window, choose the following options:
    • Format: BD SUP
    • Resolution: 1080 (regardless of whether your target is HD or UHD Blu-ray)
    • Mode: Fast
    • Frame rate: As appropriate for sync to your video track.
    • Font settings as you prefer.
  • Click “Start,” and choose a destination for your .SUP file.

Compiling the Blu-ray media data structure

Compile the Blu-ray disc using BD Wizard:

  • Open BD Wizard, and add your video, audio, and subtitle tracks to the list on the right side of the window.

  • On the left side of the window, choose a method for BD Wizard to create chapters (“scenes”) for your Blu-ray.

    • “Scenes number” will evenly distribute the specified number of chapters throughout the video.
    • “Scenes interval” will automatically place a chapter for every x minutes of video.
    • “Scenes list” will let you choose timestamps at which to place chapters. You can use the “Scene editor” button to open a GUI for choosing timestamps.
  • Again, this guide doesn’t cover how to add more than one video title, or how to add menus, bonus features, etc. So I’m skipping the pages for those features. Click next until it asks you to save your BD Wizard project file. I recommend saving to a folder with nothing else in it, because the next steps will create a bunch of files and subfolders next to the project file.

  • You will be prompted to choose a “Project name,” “Project info,” and “Blu-ray type.” You can fill anything you want into the first two fields; they will be shown when a user inserts the disc into certain players. Select Blu-ray type as follows:

    • (if targeting HD Blu-ray) choose “BD or 3D BD (v200)”.

    • (if targeting UHD Blu-ray) choose “UHD BD (v300)” and an option from the dropdown:

      • If you’ll be burning to 50GB discs, choose “50GB Default TR, 91.916 Mbit”

      • If you’ll be burning to 66GB discs, choose “66GB High TR, 143.86 Mbit”

      • If you’ll be burning to 100GB discs, choose “100GB High TR, 143.86 Mbit”

      • (If after burning your discs, your player(s) are having issues reading them, you can try turning down the TR here. This is more likely to happen if you’re using cheap no-name discs, I guess.)

      • For UHD Blu-ray, each capacity of disc has different compatible data rates, which you’ll need to chose from while creating the discs' file system:

        The specification for 4K Blu-ray allows for three disc capacities, each with its own data rate: 50 GB at 72 or 92 Mbit/s, and 66 GB and 100 GB at 92, 123, or 144 Mbit/s.

        - wikipedia: https://en.wikipedia.org/wiki/Ultra_HD_Blu-ray

  • Click OK. BD Wizard will compile a folder called MUXED_{Project name} in the destination folder you previously chose.

    • Before burning this to a disc, I recommend checking with VLC Media Player that this folder is playable. In VLC, choose “Media > Open Disc…”, select “Blu-ray”, and then choose the MUXED_{Project name} folder that BD Wizard generated. Test all video, audio, and subtitle tracks. If all looks well, then congrats! All that’s left is to burn to disc.

Burn your disc(s)

Use ImgBurn to burn your disc(s):

  • Insert your blank disc into your writer drive.
  • Open ImgBurn. Choose “Write files/folders to disc.”
  • Inside the MUXED_{Project name} folder that BD Wizard generated, you’ll find two subfolders. Add each of these subfolders to the “Source” pane in ImgBurn using the button that looks like a magnifying glass over a folder.
  • Below Source, choose the Destination drive containing your blank disc.
  • In the right side of the window, switch to the “Options” tab.
    • Leave “Data Type” set to “MODE1/2048.”
    • Under “File System,” choose “UDF.”
    • Under “UDF Revision,” choose “2.50.”
  • Again on the right side of the window, switch to the “Labels” tab.
    • Enter a label for the disc in the “UDF:” field. The bar at the bottom of the window will turn red if the label is too long.
  • Move to the “Device” tab.
    • Change “Write Speed” to the maximum speed supported by your disc. You can usually see the maximum speed printed on the disc itself, and/or the packaging the disc came in. ImgBurn should in theory choose the correct speed by default as reported by the disc, but this was not the case for me, which led to a disc being wasted.
  • Click the “Build” button (looks like a file folder, a blue arrow, and a disc being etched by a laser).
  • ImgBurn will ask you to confirm info about your disc. Click “OK.”
  • Let ImgBurn write and then verify your disc. When it’s done, it will play a jingle.
  • At this point, you may put another blank disc into the drive and burn more discs.
  • You may be tempted (as I was) to create a .iso disc image that you could use to burn more discs in the future without using ImgBurn. While this is a good idea, the resulting discs don’t work. You will need to use ImgBurn every time you write a disc.

At this point, check the quality of your discs thoroughly using a Blu-ray disc player. All video, audio, and subtitle tracks should be accounted for.

Making the discs look nice

I found that Avery 8944 CD labels could be printed with pretty good image quality on a basic color inkjet printer. Some test prints were required to dial in the colour settings in the printer’s driver. Discs with a white surface worked best with these labels.

Does it matter if I cheap out on discs?

It’s hard to say. If you’re shopping online, stick to well-reviewed products and sellers. It’s normal if you’re buying cheap discs from no-name brands to get a few duds in a stack, but maybe saving a couple of bucks per disc is worth it. What I’d be more worried about in the long-term is data integrity on cheaper discs. If long-term storage is your plan for your discs, you may want to opt to get “M-DISC” certified discs, which are lab tested to retain data after exposure to extreme conditions, which are supposed to simulate approximately 1000 years in good storage conditions.

Glossary (non-exhaustive):

  • HD Blu-ray: A specification and consumer distribution format for (for the purposes of this guide) Full HD (1920x1080p) movies.
  • UHD Blu-ray: A specification and consumer distribution format for movies in the raster resolution of 3840x2160p (aka Ultra HD, or UHD).
  • BD Wizard: A Windows application for compiling video tracks, audio tracks, subtitle tracks, and interactive graphics into the file structure required by the Blu-ray specifications.
  • ImgBurn: A Windows application for writing the Blu-ray data structure onto a disc in the correct format for playback on a Blu-ray compatible player.
  • ffmpeg: A cross-platform programming library (available as a standalone application) for converting to and from many different audio and video formats. In this guide, we use it exclusively for converting a Cineform video stream into a raw video stream, and passing that raw stream to x264 or x265. It can only be used via command-line consoles (e.g. Command Prompt on Windows computers, or Terminal on Mac computers).
  • x264: A cross-platform programming library and standalone application for encoding a video stream into the H.264 (aka AVC) format, including the specific variation of that format used for Blu-ray video discs. It can only be used via command-line consoles (e.g. Command Prompt on Windows computers, or Terminal on Mac computers).
  • x265: A cross-platform programming library and standalone application for encoding a video stream into the H.265 (aka HEVC) format, including the specific variation of that format used for UHD Blu-ray video discs. It can only be used via command-line consoles (e.g. Command Prompt on Windows computers, or Terminal on Mac computers).
  • easySUP: A cross-platform application for converting common subtitle formats to each other.
  • .SRT file: A common file format for subtitles and closed captions. Not directly compatible with Blu-ray players.
  • BD-R disc: A one-time writable disc format available in a multitude of capacities, which can be used to store either data or multimedia video for playback with a Blu-ray player.
  • VLC Media Player: A cross-platform media player application that is capable of playing a multitude of formats, including unencrypted Blu-ray discs.
  • Blu-ray SUP: A sparsely-documented format for subtitles, used by the Blu-ray video specification.
  • VPS: Virtual Private Server. A virtual machine that you rent from a cloud provider such as Azure, Hetzner, or Linode.
  • Ubuntu Linux: A free and open-source operating system based on the widely-used Linux kernel and standard GNU tools.
  • Homebrew: A package manager for macOS, which streamlines the installation, updating, and removal of software available through the Homebrew software repositories.
  • UTM: An open-source program for creating virtual machines on macOS systems.
  • Virtual machine: A computer defined in software, running on another computer.
  • System PATH: The set of directories where your computer looks for programs accessible from a command line text terminal.

Useful links: