I needed this feature on an old project and used Vimeo to accomplish that.
I know you didn't list Vimeo as one of the options you explored, but if you are open to explore it, it has a lot of privacy related options.
Reference on whitelisting domains to a private video:
https://developer.vimeo.com/api/reference/videos#add_video_privacy_domain
Using their PHP client is just a method call, after uploading your video with their Client, and fetching the video ID from the response you just have to make this call:
use Vimeo\VImeo;
$vimeo->request("{$videoId}/privacy/domains/{$domain}", [], 'PUT');
Where $vimeo is an instance of theirs' PHP client object.
===
Another option, if using S3, would be issuing temporarily signed URLs:
https://laravel.com/docs/8.x/filesystem#file-urls
(scroll to Temporary URLs section)
So when rendering a template you would create a temporary URL for the asset on S3 for a given time, maybe twice or three times the video length (in case user pauses it or internet connection is poor) and uses that as the <video> source
It won't restrict by domain, but at least would make it harder to harvest it on a later time.
The link above points to the Laravel Docs which exposes a high-level API to deal with S3, maybe using the AWS PHP Client there are more privacy options available, but you would need to check it out.
Also DO Spaces might allows a similar features, but I am not familiar with it.