I'm trying to playback Widevine-encrypted content outside of the browser. I'm trying to use the Content Decryption Module that ships with Chrome, which exports this API. After a lot of trial-and-error and research, I'm able to successfully initialize the CDM and obtain a Widevine license from the content server. The problem is that I'm not quite sure how the API is to be invoked for playback. I've got some DASH segments with encrypted samples, and I'm able to parse the sample information out of the boxes (number of samples, size of samples, sample IVs, and sample data). I thought I could decrypt audio via ContentDecryptionModule_10::Decrypt(); the call returns kSuccess but gives me decrypted buffers full of zeros. My next attempt was to try to use the CDM audio decoder via InitializeAudioDecoder() but that always returns kInitializationError. So I'm not quite sure where I'm going wrong. I realize I'm glossing over a lot of detail, but if anyone is familiar with any of this I can provide more data and code.
How can I play Widevine-encrypted content out of the browser?
1.1k Views Asked by Luke At
1
There are 1 best solutions below
Related Questions in CHROMIUM
- Why is it impossible to definitively know if your website is running as a PWA or as a website?
- Is it possible to save MHTML with scripts included?
- Chrome PDF print image aspect ratio incorrect - very apparent with small images - is there a workaround?
- How to turn off login pop-up on stackoverflow
- "Inconsistent WhatsApp Web Integration: Error with Manifest File Null Value Reading"
- Possible scroll bug with usage of overflow-hidden on body along with "sr-only" elements?
- How to solve Missing X server or $DISPLAY when trying to change the loaded website in Chromium
- Google Chrome for AWS Lambda as a layer
- Does Chromium pass URLs along with JS to V8?
- Chromium version on Puppeteer build
- Change the blue background of chrome devtool like before
- Native Messaging "Specified native messaging host not found" debugging
- PDF-documents not loading inside iframe in Chrome and Edge
- ReferenceError: ReadableStream is not defined using Puppeteer's page.pdf() on AWS
- Why is MediaQuery.of(context).size.height in Flutter detecting a larger height in Android chromium-based browsers?
Related Questions in DRM
- Save and Play DRM secured audio file in ios
- What exactly is Widevine? And how to ensure that I have this key on device?
- OAuth in PlayReady License Retrieval in UWP
- WideVine tvOS support
- How to check widevine DRM present on the Android Device
- DRM security level on Android
- HTML5 Video DRM - detect HDCP (output protection) then downgrade to SD content?
- Best way to encrypt ePub file
- programmatically deleted cached persistant Playready License
- Secure Encryption of File on Disk
- Sending some non-encrypted fragments in a PlayReady stream
- Run Qt app with eglfs plugin on a normal computer
- decrypt function at run time and use it QT c++
- protecting CD rom from creating its ISO
- Widevine DRM on Windows 8 modern app is it possible?
Related Questions in MPEG-DASH
- Which content providers support MPEG-DASH
- Youtube Stats for Nerds: What does the (137/140) behind "DASH: yes" stand for?
- samsung tv mpeg-dash delivery
- Flush & Latency Issue with Fragmented MP4 Creation in FFMPEG
- I want to upload a camera video stream to Amazon S3 and download it to an Android phone. I'm completely new to this. How can I do this?
- How to merge mp4 audio dash fragment with another audio
- Why is one ffmpeg webm dash stream much larger than the others?
- mpeg-dash with live stream
- HTML5 Video DRM - detect HDCP (output protection) then downgrade to SD content?
- HLS (Http Live Streaming) vs MPEG DASH
- MPEG-DASH picky in fragmented mp4 sampleOffsets and sampleSizes?
- How to Decrypt and Play CENC protected contents in DASH?
- Live stream multi-bitrate video
- Example Encrypted Media Extensions encryption
- Create MPEG DASH segments from h264 files
Related Questions in WIDEVINE
- Dashjs and persistence license, how to handle an expired/obsolete license sessionId on playback?
- How to download Widevine encrypted m3u8 stream
- video.js multiple sources for fairplay widevine playready livestream DRM
- Netflix not working in my chromium browser fork
- How to create an Android custom MediaCas plugin?
- How to detect if video playback was blocked by DRM?
- Getting Protected Content License Error while playing DRM Protected Video in Roku Brightscript
- I want to setup a DRM based video stream with both widevine and play ready
- Is it possible to implement hardware-backed DRM with ClearKey?
- How can I play Widevine-encrypted content out of the browser?
- Is it possible to play DRM content by pure Javascript and video HTML5?
- How to verify if L1 license key and which one is installed for oemcrypto
- Widevine license format expected by Chromecast receiver
- Cast: Intercepting (and adjusting) response from Widevine license proxy
- WideVine Certification DRM problem on Android phone
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
At a very high level, without going into detail of the code etc, if you were able to use the CDM to decrypt the content and receive back unencrypted content that you or your app could view, then this would be a loophole or an error in the content protection system as it should not allow this.
This does not mean it is not possible, just that it's not the intent and you could not rely on the loophole or error not being fixed over time.
The CDM is usually intended to either decrypt and play the content securely itself, or to pass it back to a secure media path that will play it back without the app or even the OS being able to see the decrypted media.
This is sort of shown in the diagram below in the EME spec - the content, or frames, never get back to the app itself (https://www.w3.org/TR/encrypted-media/):
However, in your case, I think you just want to play back the content and you are not trying to actually view or access the decrypted content. If so, the cross platform Electron framework has a fork which supports CDM based playback for apps. This may meet your needs, although it is still using chromium and web technologies. Even if it does not it may give you useful insight into how the guys at Castlabs, the ones who created the fork, achieved this.