How to download Apple event videos in 4K with Dolby Atmos

Published by malhal on

First visit the Apple Events web page and find the link to the stream you want to download, e.g. the link for the iPhone 14 event from September 2022 looks like this:

https://events-delivery.apple.com/2807skttevpekgjkgcyolyxgkexyahqp/m3u8/vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj.m3u8

Now you need to install the yt-dlp command line utility, in Terminal type:

brew install yt-dlp

yt-dlp is a fork of the youtube-dl utility that has better compatibility. Although these utilities are primarily designed for Youtube both work with many other kinds of streams.

Next, you need to view the audio and video formats available in the stream, using the uppercase -F argument:

% yt-dlp -F 'https://events-delivery.apple.com/2807skttevpekgjkgcyolyxgkexyahqp/m3u8/vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj.m3u8' 
[generic] Extracting URL: https://events-delivery.apple.com/2807skttevpekgjkgcyolyxgkexyahqp/m3u8/vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj.m3u8
[generic] vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj: Downloading webpage
[generic] vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj: Downloading m3u8 information
[info] Available formats for vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj:
ID                                              EXT RESOLUTION FPS │    TBR PROTO │ VCODEC           VBR ACODEC     MORE INFO
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
audio-atmos-eac3-640-English                    mp4 audio only     │        m3u8  │ audio only           unknown    [en] English
audio-atmos-eac3-640-English_Audio_Descriptions mp4 audio only     │        m3u8  │ audio only           unknown    [en] English Audio Descriptions
audio-stereo-aac-128-English                    mp4 audio only     │        m3u8  │ audio only           unknown    [en] English
audio-stereo-aac-128-English_Audio_Descriptions mp4 audio only     │        m3u8  │ audio only           unknown    [en] English Audio Descriptions
401                                             mp4 640x360     30 │   401k m3u8  │ avc1.64001e     401k video only
434                                             mp4 640x360     30 │   434k m3u8  │ avc1.64001e     434k video only
911                                             mp4 640x360     30 │   912k m3u8  │ avc1.64001e     912k video only
944                                             mp4 640x360     30 │   944k m3u8  │ avc1.64001e     944k video only
510                                             mp4 640x360     30 │   511k m3u8  │ hvc1.1.6.H120   511k video only
1021                                            mp4 640x360     30 │  1021k m3u8  │ hvc1.1.6.H120  1021k video only
835                                             mp4 960x540     30 │   836k m3u8  │ avc1.64001f     836k video only
1346                                            mp4 960x540     30 │  1346k m3u8  │ avc1.64001f    1346k video only
805                                             mp4 960x540     30 │   806k m3u8  │ hvc1.1.6.H120   806k video only
1316                                            mp4 960x540     30 │  1316k m3u8  │ hvc1.1.6.H120  1316k video only
1192                                            mp4 1280x720    30 │  1193k m3u8  │ avc1.4d401f    1193k video only
1265                                            mp4 1280x720    30 │  1266k m3u8  │ avc1.64001f    1266k video only
1703                                            mp4 1280x720    30 │  1703k m3u8  │ avc1.4d401f    1703k video only
1776                                            mp4 1280x720    30 │  1776k m3u8  │ avc1.64001f    1776k video only
1177                                            mp4 1280x720    30 │  1177k m3u8  │ hvc1.1.6.H120  1177k video only
1255                                            mp4 1280x720    30 │  1255k m3u8  │ hvc1.1.6.H120  1255k video only
1687                                            mp4 1280x720    30 │  1688k m3u8  │ hvc1.1.6.H120  1688k video only
1765                                            mp4 1280x720    30 │  1765k m3u8  │ hvc1.1.6.H120  1765k video only
2905                                            mp4 1920x1080   30 │  2905k m3u8  │ avc1.640028    2905k video only
3197                                            mp4 1920x1080   30 │  3197k m3u8  │ avc1.640028    3197k video only
3415                                            mp4 1920x1080   30 │  3416k m3u8  │ avc1.640028    3416k video only
3707                                            mp4 1920x1080   30 │  3707k m3u8  │ avc1.640028    3707k video only
2808                                            mp4 1920x1080   30 │  2809k m3u8  │ hvc1.1.6.H120  2809k video only
3070                                            mp4 1920x1080   30 │  3071k m3u8  │ hvc1.1.6.H120  3071k video only
3319                                            mp4 1920x1080   30 │  3319k m3u8  │ hvc1.1.6.H120  3319k video only
3581                                            mp4 1920x1080   30 │  3581k m3u8  │ hvc1.1.6.H120  3581k video only
4661                                            mp4 2560x1440   30 │  4661k m3u8  │ hvc1.1.6.H150  4661k video only
5171                                            mp4 2560x1440   30 │  5172k m3u8  │ hvc1.1.6.H150  5172k video only
8243                                            mp4 3840x2160   30 │  8244k m3u8  │ hvc1.1.6.H150  8244k video only
8754                                            mp4 3840x2160   30 │  8754k m3u8  │ hvc1.1.6.H150  8754k video only
10729                                           mp4 3840x2160   30 │ 10729k m3u8  │ hvc1.1.6.H150 10729k video only
11239                                           mp4 3840x2160   30 │ 11239k m3u8  │ hvc1.1.6.H150 11239k video only

We’ll download the best audio and video streams available, which is the atmos and highest bitrate 4k. We need to look at the first column to find the IDs of these streams and use them with the lowercase -f argument and + to combine the streams:

% yt-dlp -f 11239+audio-atmos-eac3-640-English 'https://events-delivery.apple.com/2807skttevpekgjkgcyolyxgkexyahqp/m3u8/vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj.m3u8' 
[generic] Extracting URL: https://events-delivery.apple.com/2807skttevpekgjkgcyolyxgkexyahqp/m3u8/vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj.m3u8
[generic] vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj: Downloading webpage
[generic] vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj: Downloading m3u8 information
[info] vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj: Downloading 1 format(s): 11239+audio-atmos-eac3-640-English
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 949
[download] Destination: vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj [vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj].f11239.mp4
[download] 100% of    7.03GiB in 00:10:07 at 11.86MiB/s
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 953
[download] Destination: vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj [vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj].faudio-atmos-eac3-640-English.mp4
[download] 100% of  434.95MiB in 00:04:50 at 1.50MiB/s
[Merger] Merging formats into "vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj [vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj].mp4"
Deleting original file vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj [vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj].f11239.mp4 (pass -k to keep)
Deleting original file vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj [vod_index-bHTtMFcgdqmJGoHoDBPadNWwGwrNevrj].faudio-atmos-eac3-640-English.mp4 (pass -k to keep)

We can monitor the progress of the download and if we don’t like the download size or time it will take we can cancel with ctrl+c and select different streams. The above output was copied when the download was complete, first it downloaded the video, then audio and finally merged them into one at a file size of 8.01GB.

Some improvements you could make is download multiple audio streams to make the file more compatible across different devices or choose an output filename so don’t need to rename afterwards. Please post a comment if you would like to include any of these changes in this article.

Categories: Uncategorised