Streaming

RSS for tag

Deep dive into the technical specifications that influence seamless playback for streaming services, including bitrates, codecs, and caching mechanisms.

Streaming Documentation

Posts under Streaming subtopic

Post

Replies

Boosts

Views

Activity

HLS Offline Error Domain=CoreMediaErrorDomain Code=-16247 on DRM-protected streams
Hello, I keep getting this kind of errors (specifically 16247) when trying to download DRM-protected HLS content, would anyone have a clue about the reason why ? Error Domain=CoreMediaErrorDomain Code=-16247 "(null)" UserInfo={_NSURLErrorRelatedURLSessionTaskErrorKey=("BackgroundAVAssetDownloadTask Thanks Sylvain
0
1
1.1k
Feb ’24
FairPlay Content Packaging Using mediafilesegmenter tool
New to FairPlay implementation. Following Apple's "FairPlay Streaming Programming Guide", to transcoded & encrypted a MP4 file using command - mediafilesegmenter --stream-encrypt --streaming-key-delivery --encrypt-key-file=./key_iv.bin --encrypt-key-url="skd://example/key" ./input-content.mp4 key_iv.bin is the file which contains Encryption Key and Initialisation Vector. It is generating HLS's playlist, index and segment files. To test the encryption and the decryption precess, I am taking one segment file(which is generated by mediafilesegmenter, say fileSequence125.ts) and trying to decrypt(algorithm is "AES/CBC/NOPADDING") it using the same Encryption Key and Initialisation Vector, then I am getting bellow errors - Input length not multiple of 16 bytes So, does it means the length/size of each segment(.ts) file, which is generated by the mediafilesegmenter, should be a multiple of 16 bytes?
0
0
821
Apr ’23
Couldn't able to hear audio via speaker on ios real device
This is my native module code implementation I'm getting base64 encoded string from server and passing this to my native module of pcm player to play audio App.tsx PcmPlayer.writeChunk(e.data); PcmPlayer.swift import AVFoundation @objc(PcmPlayer) class PcmPlayer: RCTEventEmitter { private var engine: AVAudioEngine? private var playerNode: AVAudioPlayerNode? private var format: AVAudioFormat? private var bufferQueue = [Data]() private var isPlaying = false private var hasEnded = false private var scheduledBufferCount = 0 private let minBufferBytes = 50000 private let pcmQueue = DispatchQueue(label: "pcm.queue") override init() { super.init() } override func supportedEvents() -> [String]! { return ["onStatus", "onMessage"] } @objc(initPlayer:channels:bitsPerSample:) func initPlayer(_ sampleRate: NSNumber, channels: NSNumber, bitsPerSample: NSNumber) { pcmQueue.async { self.stopInternal() let session = AVAudioSession.sharedInstance() do { try session.setCategory(.playback, mode: .default, options: []) try session.setActive(true, options: .notifyOthersOnDeactivation) try session.setMode(.default) print("🔈 Audio session active. Output route:", session.currentRoute.outputs) } catch { print("❌ Audio session setup failed:", error) return } self.engine = AVAudioEngine() self.playerNode = AVAudioPlayerNode() guard let engine = self.engine, let playerNode = self.playerNode else { print("❌ Engine or playerNode is nil") return } engine.attach(playerNode) self.format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate.doubleValue, channels: AVAudioChannelCount(channels.uintValue), interleaved: false) guard let format = self.format else { print("❌ Failed to create AVAudioFormat") return } engine.connect(playerNode, to: engine.mainMixerNode, format: format) do { try engine.start() playerNode.play() engine.mainMixerNode.outputVolume = 1.0 print("✅ AVAudioEngine started with format:", format) } catch { print("❌ Engine start failed:", error) } self.hasEnded = false } } @objc(writeChunk:) func writeChunk(_ base64Pcm: String) { pcmQueue.async { guard base64Pcm.count >= 10 else { print("⚠️ Skipping short base64 string") return } var padded = base64Pcm let mod4 = base64Pcm.count % 4 if mod4 > 0 { padded += String(repeating: "=", count: 4 - mod4) } guard let data = Data(base64Encoded: padded, options: .ignoreUnknownCharacters) else { print("❌ Failed to decode base64") return } self.bufferQueue.append(data) print("📥 Received PCM chunk (\(data.count) bytes)") print("📥 writeChunk called. isPlaying=\(self.isPlaying), bufferQueue.count=\(self.bufferQueue.count)") if !self.isPlaying { self.isPlaying = true self.waitForBufferAndStartPlayback() } else if self.scheduledBufferCount == 0 { self.isPlaying = true self.waitForBufferAndStartPlayback() } } } private func waitForBufferAndStartPlayback() { DispatchQueue.global().async { while self.queueSize() < self.minBufferBytes && !self.hasEnded { Thread.sleep(forTimeInterval: 0.01) } self.writeLoop() } } private func writeLoop() { DispatchQueue.global().async { writeLoop: while self.isPlaying { if self.bufferQueue.isEmpty { for _ in 0..<100 { Thread.sleep(forTimeInterval: 0.01) if !self.bufferQueue.isEmpty { break } } if self.bufferQueue.isEmpty { print("🔇 No more data to play after waiting") self.isPlaying = false break writeLoop } } var data: Data? self.pcmQueue.sync { if !self.bufferQueue.isEmpty { data = self.bufferQueue.removeFirst() } } guard let chunk = data else { print("⚠️ No data to process") continue } if let buffer = self.pcmBufferFromData(chunk) { self.scheduledBufferCount += 1 self.playerNode?.scheduleBuffer(buffer, completionHandler: { self.pcmQueue.async { self.scheduledBufferCount -= 1 if self.bufferQueue.isEmpty && self.scheduledBufferCount == 0 { print("ℹ️ Playback idle - waiting for more data") self.isPlaying = false } } }) } } } } private func pcmBufferFromData(_ data: Data) -> AVAudioPCMBuffer? { guard let format = self.format else { return nil } let frameCount = UInt32(data.count / 2) guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCount) else { print("❌ Failed to create AVAudioPCMBuffer") return nil } buffer.frameLength = frameCount guard let floatChannelData = buffer.floatChannelData?[0] else { print("❌ floatChannelData is nil") return nil } data.withUnsafeBytes { (rawBuffer: UnsafeRawBufferPointer) in let int16Buffer = rawBuffer.bindMemory(to: Int16.self) let count = min(int16Buffer.count, Int(frameCount)) for i in 0..<count { floatChannelData[i] = Float32(int16Buffer[i]) / Float32(Int16.max) } } return buffer } @objc(stopPlayer) func stopPlayer() { pcmQueue.async { self.stopInternal() } } private func stopInternal() { print("🛑 stopInternal called") self.playerNode?.stop() self.engine?.stop() self.engine?.reset() self.playerNode = nil self.engine = nil self.format = nil self.bufferQueue.removeAll() self.isPlaying = false self.hasEnded = true self.scheduledBufferCount = 0 } @objc(canWrite:rejecter:) func canWrite(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { pcmQueue.async { resolve(self.bufferQueue.count < 20) } } @objc(flushPlayer:rejecter:) func flushPlayer(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { pcmQueue.async { self.bufferQueue.removeAll() resolve(nil) } } @objc static override func requiresMainQueueSetup() -> Bool { return false } private func queueSize() -> Int { return pcmQueue.sync { return self.bufferQueue.reduce(0) { $0 + $1.count } } } } I couldn't able to hear any audio via my real iOS device also it is working fine on emulator.
0
0
363
Jul ’25
Fairplay 4k streams decode errors - no video, audio only
HLS live streaming 4k is not displaying any video, but is streaming audio. Getting the following errors in the console where it shows that it is failing to decode every frame. Can I get some help as to what these error codes refer to and why it would fail to decode? 08:30:42.675879-0800 videocodecd AppleAVD: AppleAVDDecodeFrameInternal(): avdDec - Frame# 3588, DecodeFrame failed with error: 0x196 08:30:42.675908-0800 videocodecd AppleAVD: AppleAVDDisplayCallback(): Asking fig to drop frame # 3588 with err -12909 - internalStatus: 315 08:30:42.697412-0800 videocodecd AppleAVD: AppleAVDDecodeFrameResponse(): Frame# 3589 DecodeFrame failed with error 0x00000196 08:30:42.697876-0800 videocodecd AppleAVD: AppleAVDDecodeFrameInternal(): failed - error: 406
0
0
487
Dec ’24
Issue in playing fairplay video
We have to play some encrypted videos from server. In AVAssetResourceLoaderDelegate we got the ckc data correctly and responded with that. Then video just starts playing and stops immdediately. When we check the playerItem error description we got Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo={NSLocalizedDescription=Cannot Complete Action, NSLocalizedRecoverySuggestion=Try again later.}. Any one encountered this?
0
0
698
Dec ’23
Hide subtitle track or audio track on the AirPlay device
Hello I have a HLS manifest with multiple audio and multiple subtitle tracks. I use AVPlayer on iOS to play this HLS asset. On the iOS app I have the freedom to display selective subtitle and audio track list to the user but when the user uses AirPlay on the iOS, all the subtitle and audio tracks available in the HLS manifest is displayed to the user on the Apple TV (or any AirPlay compatible device). Let me explain with one example. Say, the HLS manifest has the following tracks: English, Spanish & German audio tracks English, Italian, Spanish & German subtitle tracks When the user uses AirPlay, I want to hide German language and display only the following tracks on the Apple TV: English & Spanish audio tracks English, Italian & Spanish subtitle tracks The primary intent here is that the user should not be able to see German language anywhere on the target AirPlay device. How to achieve this in code? Note: It's difficult to modify the source HLS manifest file.
0
0
1.5k
Jun ’22
How to pause HLS live using AV-Player
Used the PreferredForwardBufferDuration, this also after 2 - 3 minutes unable to pause the video, its catching live if pause duration more than 2 -3 minutes. Example:  [self.player.currentItem setPreferredForwardBufferDuration:60];   self.player.automaticallyWaitsToMinimizeStalling = YES;  self.player.currentItem.canUseNetworkResourcesForLiveStreamingWhilePaused = NO; How to stop buffering the AV-Player during pause state How to clear the AV-Player buffer during pause. SeekToTime is not working properly for live channel, I want to seek just one/two sec back. With SeekToTime if av-player unable to seek to previous time line its catching the future position. Manifest providing to av-player, #EXT-X-VERSION:4 #EXT-X-TARGETDURATION:1 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-KEY:METHOD=AES- http://ServerAddress/f1655359642.ts #EXT-X-KEY:METHOD=AES- http://ServerAddress/f1655359643.ts #EXT-X-KEY:METHOD=AES- #EXTINF:0.984, http://ServerAddress/f1655359644.ts
0
0
1.2k
Jun ’22
### HEVC/H.265 playback works on iPhone 13 and iPhone 15 but fails on iPhone X and iPhone 17 Pro Max
Hi Apple Developer Community, I’m investigating an HEVC/H.265 playback issue in an iOS application and would appreciate some guidance regarding device-level HEVC compatibility and AVFoundation/VideoToolbox behavior. Our application plays video content encoded in both H.264 and H.265 (HEVC). Current observations The same H.265 video content produces the following results: Device H.264 H.265 iPhone X Works Does not play iPhone 13 Works Works iPhone 15 Works Works iPhone 17 Pro Max Works Does not play H.264 playback works consistently across all tested devices. The interesting part is that H.265 works on the iPhone 13 and iPhone 15, but does not work on either the older iPhone X or the newer iPhone 17 Pro Max. This makes me unsure whether the issue is related to the device's HEVC hardware decoder, a specific HEVC profile/level/pixel format, codec/container signaling, or the playback framework. Questions Are there known differences in HEVC/H.265 decoding capabilities or supported profiles between these iPhone generations that could explain this behavior? Can a newer device such as the iPhone 17 Pro Max have compatibility limitations with a particular HEVC stream that successfully plays on an iPhone 13 or iPhone 15? Are there specific HEVC parameters that I should compare when troubleshooting this, such as: HEVC profile (Main / Main 10) Level and tier 8-bit vs 10-bit Pixel format Chroma subsampling (4:2:0 / 4:2:2) Resolution and frame rate Bitrate HDR10 / HLG / SDR Color primaries / transfer characteristics hvc1 vs hev1 MP4/fMP4 vs MPEG-TS container Audio codec Is there an Apple-recommended API or method to determine at runtime whether a particular HEVC stream is supported by the current device before attempting playback? If using AVPlayer/AVPlayerItem, what is the recommended way to diagnose whether a failure is caused by: Unsupported HEVC characteristics VideoToolbox decoding Container/codec signaling Audio decoding AVFoundation Network/streaming configuration? Are there any differences in HEVC support between local MP4 playback and HLS/fMP4 playback that I should take into account? Additional investigation I am planning to inspect the exact video characteristics using ffprobe/MediaInfo and compare a working stream against a failing stream. For example, I intend to compare: Codec Codec tag (hvc1 / hev1) Profile Level Tier Bit depth Pixel format Resolution Frame rate Bitrate Chroma subsampling Color space HDR metadata Container Audio codec I will also test the same video outside the application to determine whether this is specific to our playback implementation or to the HEVC stream/device combination. Main question The main thing I would like to understand is: How can the same H.265 content be successfully decoded on an iPhone 13 and iPhone 15, while failing on both an older iPhone X and a much newer iPhone 17 Pro Max? Is there an Apple-documented compatibility matrix or recommended diagnostic approach for identifying which HEVC characteristic is responsible for this behavior? Any guidance on the relevant Apple documentation, AVFoundation APIs, VideoToolbox APIs, or known device-specific HEVC limitations would be greatly appreciated. Thank you.
0
0
157
Sep ’26
Where can I get the private key to decrypt SPC requested from safari on Mac OS?
Hi, We are trying to adopt FPS for mp4 content protection playing on safari browser of Mac OS. I have verified that native functions of safari browser support the decryption for AES-128 encrypted TSs based on EME of HTML5 and HLS mechanism, where the CEK stores in http server described in the m3u8 manifest and is delivered to the browser in plain. Although it is a simple and easy solution to protect the mp4 contents, the security is still matter because the key is delivered in plain. So we decided to implment a key server to issue the CKC message after receiving SPC as safari browser's key request. I have a question before starting it. Q: The Encrypted AES-128 key in the Table 2-3. SPC container structure of FairPlay Streaming Programming Guide document says that "This key is itself encrypted, using RSA public key encryption with Optimal Asymmetric Encryption Padding (OAEP)". It means we needs a private key to decrypt it. I understand it if the client is a proprietary application so that the public key would be one of the FPS development credential, which will be issued by Apple according to our request. Because the client application can use the public key during the implementation. But what if the client is the safari browser? We cannot use any kind of new issued public key for the safari browser. I guess Mac OS uses some fixed public key which is already issued by Apple for safari browser's FPS. Now how can I get the counter private key? It could not be contained in the FPS credential. Because it should be a fixed one, not new generated one.
0
0
848
Jun ’22
Does HLS support MVHEVC HDR10 ?
I am setting up a HLS server for MVHEVC files... just find that if tag mp4 files using Asset Writer with let colorPropertySettings = [ AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_709_2, AVVideoYCbCrMatrixKey: AVVideoTransferFunction_ITU_R_709_2, AVVideoTransferFunctionKey: AVVideoYCbCrMatrix_ITU_R_709_2 ] the HLS playback well on Safari. but if tag mp4 files using using Asset Writer with let colorPropertySettings = [ AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_2020, AVVideoYCbCrMatrixKey: AVVideoYCbCrMatrix_ITU_R_2020, AVVideoTransferFunctionKey: AVVideoTransferFunction_SMPTE_ST_2084_PQ ] the HLS can not play on Safari. looks like HLS does NOT support MVHEVC HDR10. OR have I lost any setting for MVHEVC HDR10? thanks.
0
0
630
May ’24
MusicKit for Android - support or cancel it
We all know the state of MusicKit SDK for Android is catastrophic - it's buggy, it's lacking features and it has not been updated in ages. It's sad though, as on Android there is (and this came as quite a surprise to me) no real alternative if you want to build an app with music content from a streaming service. So why, really why, does Apple not do anything in this area? Just give us an updated version of the SDK and we can continue on building apps that work on iOS and on Android.
0
0
276
5d
Video Streaming Site and working with Safari Autoplay Policy
Hello all, I am currently developing a video streaming site and am currently working on the video player. The site will be serving video content using HLS given that this will be quite sizable and long video content. Given that the main functionality of the site is to watch streaming video, when a user clicks on a video to watch, when the video player page opens, the desire is to have the video start playing automatically with sound. Safari autoplay policy basically rejects attempts to autoplay video content with audio unless the audio starts muted, otherwise, the user needs to interact with the player in order to start the video playing with audio unmuted. Given that the main purpose of the site is to watch these videos, it would be hugely detrimental to require the user to interact with the player to either start playing the video, or to unmute it. Many sites such as YouTube, Twitch, and others obviously have autoplay functionality that works as I would expect for a video-centric site in Safari. Given their size, I imagine they have some agreement with Safari team to have their site pre-authorized to allow autoplay with audio. How do I go about doing this? Hoping someone might be able to share some information that would be useful to ensure I can have things configured correctly such that my Safari users won't have to suffer having to manually start playing, or turn on their audio in order to enjoy the videos the same way Chrome and Firefox users will automatically. Thanks!
0
0
878
Jul ’22
ScreenCaptureKit stops capturing after ~10–15 minutes unexpectedly
When using the built-in macOS screen recording feature, the recording stops automatically after approximately 10–15 minutes without any warning or error message. No manual stop action is performed. The recording simply ends silently. The same issue also occurs when using ScreenCaptureKit in a custom application, which suggests this may be a system-level issue related to screen capture rather than an app-specific problem. This issue is reproducible and happens consistently after running for a period of time.
0
0
576
Apr ’26
Feasibility and Privacy Concerns for App Monitoring and Blocking 3rd Party Apps on iOS
Hello, I am interested in developing an iOS app that can monitor and potentially block third-party applications while a specific app is running. I would like to inquire about the feasibility of implementing such functionality within the iOS ecosystem and if there are any privacy terms or restrictions that I need to be aware of to ensure compliance with Apple's policies. Thank you for your guidance.
0
0
609
Sep ’23
Technical guidance request: native screen capture protection on macOS with Flutter while allowing AirPlay
Hello Apple Developer Support, I am reaching out for technical guidance regarding screen capture protection behavior on macOS. We are building a desktop application using Flutter running on macOS, and we have implemented native Swift code inside the macOS Runner in order to protect sensitive content from screen recording and screen sharing. Our current implementation relies on native window-level protection and display state handling from Swift, while the main UI remains rendered by Flutter. The main challenge we are facing is the following: we need to keep a strong native anti-recording protection on macOS the application is heavily used with AirPlay and screen mirroring currently, AirPlay / mirroring is often interpreted by the system similarly to screen capture or screen recording this causes our protected content to be replaced by a gray or blank area even during legitimate AirPlay usage In practice, we would like to allow: AirPlay legitimate external display / mirroring usage while still preventing: screen recording screen sharing unauthorized screen capture We would like to know whether Apple recommends an official supported approach for this use case, preferably using public APIs. More specifically: Is there an officially supported way on macOS to distinguish AirPlay mirroring from screen recording / screen sharing? Is "NSWindow.sharingType" the recommended public API for this scenario? Is there a recommended approach when the UI surface is rendered through Flutter / Metal? Are there any best practices with ScreenCaptureKit for protecting content without affecting AirPlay? We understand that some lower-level APIs may not be officially supported, so we would greatly appreciate guidance toward a public and future-proof implementation path. Thank you very much for your time and support. Best regards, Tony
0
0
888
Apr ’26
How can I create a Clear key HLS using Shaka-Packager
Hello, I'm try to create a working Clear-key HLS stream using Shaka-packager. Shaka packager support only SAMPLE-AES. when implemented, it's looks like the resulting stream is no't playable in Safary browser. This is the example M3U8 file starts: #EXTM3U #EXT-X-VERSION:6 ## Generated with https://github.com/google/shaka-packager version v2.6.1-634af65-release #EXT-X-TARGETDURATION:13 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-MAP:URI="audio_und_2c_128k_aac_init.mp4" #EXT-X-KEY:METHOD=SAMPLE-AES,URI="https://www.httpstest.com:771/key.key",IV=0x00000000000000000000000000000000,KEYFORMAT="identity" #EXTINF:10.008, audio_und_2c_128k_aac_1.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_2.mp4 #EXTINF:9.985, audio_und_2c_128k_aac_3.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_4.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_5.mp4 #EXTINF:9.985, audio_und_2c_128k_aac_6.mp4 #EXTINF:0.093, audio_und_2c_128k_aac_7.mp4 #EXT-X-ENDLIST I'm looking for: A. a working example of SAMPLE-AES Clear key encrypted HLS (so I will be able to learn from it how it should be defined for IOS) B. help on how to create a clear key working HLS stream for IOS/macOS (Safari)
0
0
1.1k
Sep ’23
SCK/replayd behaviors and delays
We're troubleshooting SCK issues. They occur with a relatively small amount of sessions, but lack of context and/or ability to advise the customer on how they could make behavior more predictable and reliable is problematic. Generally, there is 2 distinct issues which may or may not have the same root cause: Failure to establish SCK session. Usually manifests within the app as SCShareableContent.getWithCompletionHandler call either never invoking the completion handler, or taking prohibitively long time (we usually give it 3-10 sec before giving up). In the system log it may look like this: (log omitted - suspecting it triggers the content filter) Note the 6 seconds delay to completion of fetchShareableContentWithOption (normally it's a 30-40ms operation). Sometime, we'd see the stream established, but some minutes (or even hours) into the recording we'd stop receiving frames. Both scenarios are likely to occur when the disk space is low, with reliable repro of the problem #2 at below 8gb of free space (in that case, we've seen replayd silently dropping the session, without ever notifying the client ... improving API could go a long way there). However, out of recent occurrences, while most have less than 100GB available, we've seen it on machines with as much as 500GB free. Unfortunately, it's almost never reproducible in dev environment, so we have to rely on diagnostics we're able to collect in the field -- which nothing obvious yet. I'd like to understand the root cause of both scenarios better and/or how what specific frameworks can cause these behaviors.
0
0
842
Jan ’26
Unreliable offline playback of HLS stream
Hello all, I recently encountered a problem similar to what has been asked here (sadly no answer): https://developer.apple.com/forums/thread/127808?login=true When downloading an HLS stream via an aggregate task (regardless if I set it to use preferred, or all media selections) I get an error on offline playback. If my device is connected, all seems to work ok. Upon inspection of the boot.xml in the .movpkg file, I can see some streams report <Complete>NO</Complete></Stream> I cannot quite work out why this is. Before playback the resultant AVURLAsset's status is not ready. The movie has multiple audio and a single subtitle and video tracks. It is important to mention, playback seems to work for some of my test videos. I also use a VPN. Any assistance would be much appreciated.
0
0
1.1k
Aug ’22
HLS Offline Error Domain=CoreMediaErrorDomain Code=-16247 on DRM-protected streams
Hello, I keep getting this kind of errors (specifically 16247) when trying to download DRM-protected HLS content, would anyone have a clue about the reason why ? Error Domain=CoreMediaErrorDomain Code=-16247 "(null)" UserInfo={_NSURLErrorRelatedURLSessionTaskErrorKey=("BackgroundAVAssetDownloadTask Thanks Sylvain
Replies
0
Boosts
1
Views
1.1k
Activity
Feb ’24
FairPlay Content Packaging Using mediafilesegmenter tool
New to FairPlay implementation. Following Apple's "FairPlay Streaming Programming Guide", to transcoded & encrypted a MP4 file using command - mediafilesegmenter --stream-encrypt --streaming-key-delivery --encrypt-key-file=./key_iv.bin --encrypt-key-url="skd://example/key" ./input-content.mp4 key_iv.bin is the file which contains Encryption Key and Initialisation Vector. It is generating HLS's playlist, index and segment files. To test the encryption and the decryption precess, I am taking one segment file(which is generated by mediafilesegmenter, say fileSequence125.ts) and trying to decrypt(algorithm is "AES/CBC/NOPADDING") it using the same Encryption Key and Initialisation Vector, then I am getting bellow errors - Input length not multiple of 16 bytes So, does it means the length/size of each segment(.ts) file, which is generated by the mediafilesegmenter, should be a multiple of 16 bytes?
Replies
0
Boosts
0
Views
821
Activity
Apr ’23
Couldn't able to hear audio via speaker on ios real device
This is my native module code implementation I'm getting base64 encoded string from server and passing this to my native module of pcm player to play audio App.tsx PcmPlayer.writeChunk(e.data); PcmPlayer.swift import AVFoundation @objc(PcmPlayer) class PcmPlayer: RCTEventEmitter { private var engine: AVAudioEngine? private var playerNode: AVAudioPlayerNode? private var format: AVAudioFormat? private var bufferQueue = [Data]() private var isPlaying = false private var hasEnded = false private var scheduledBufferCount = 0 private let minBufferBytes = 50000 private let pcmQueue = DispatchQueue(label: "pcm.queue") override init() { super.init() } override func supportedEvents() -> [String]! { return ["onStatus", "onMessage"] } @objc(initPlayer:channels:bitsPerSample:) func initPlayer(_ sampleRate: NSNumber, channels: NSNumber, bitsPerSample: NSNumber) { pcmQueue.async { self.stopInternal() let session = AVAudioSession.sharedInstance() do { try session.setCategory(.playback, mode: .default, options: []) try session.setActive(true, options: .notifyOthersOnDeactivation) try session.setMode(.default) print("🔈 Audio session active. Output route:", session.currentRoute.outputs) } catch { print("❌ Audio session setup failed:", error) return } self.engine = AVAudioEngine() self.playerNode = AVAudioPlayerNode() guard let engine = self.engine, let playerNode = self.playerNode else { print("❌ Engine or playerNode is nil") return } engine.attach(playerNode) self.format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate.doubleValue, channels: AVAudioChannelCount(channels.uintValue), interleaved: false) guard let format = self.format else { print("❌ Failed to create AVAudioFormat") return } engine.connect(playerNode, to: engine.mainMixerNode, format: format) do { try engine.start() playerNode.play() engine.mainMixerNode.outputVolume = 1.0 print("✅ AVAudioEngine started with format:", format) } catch { print("❌ Engine start failed:", error) } self.hasEnded = false } } @objc(writeChunk:) func writeChunk(_ base64Pcm: String) { pcmQueue.async { guard base64Pcm.count >= 10 else { print("⚠️ Skipping short base64 string") return } var padded = base64Pcm let mod4 = base64Pcm.count % 4 if mod4 > 0 { padded += String(repeating: "=", count: 4 - mod4) } guard let data = Data(base64Encoded: padded, options: .ignoreUnknownCharacters) else { print("❌ Failed to decode base64") return } self.bufferQueue.append(data) print("📥 Received PCM chunk (\(data.count) bytes)") print("📥 writeChunk called. isPlaying=\(self.isPlaying), bufferQueue.count=\(self.bufferQueue.count)") if !self.isPlaying { self.isPlaying = true self.waitForBufferAndStartPlayback() } else if self.scheduledBufferCount == 0 { self.isPlaying = true self.waitForBufferAndStartPlayback() } } } private func waitForBufferAndStartPlayback() { DispatchQueue.global().async { while self.queueSize() < self.minBufferBytes && !self.hasEnded { Thread.sleep(forTimeInterval: 0.01) } self.writeLoop() } } private func writeLoop() { DispatchQueue.global().async { writeLoop: while self.isPlaying { if self.bufferQueue.isEmpty { for _ in 0..<100 { Thread.sleep(forTimeInterval: 0.01) if !self.bufferQueue.isEmpty { break } } if self.bufferQueue.isEmpty { print("🔇 No more data to play after waiting") self.isPlaying = false break writeLoop } } var data: Data? self.pcmQueue.sync { if !self.bufferQueue.isEmpty { data = self.bufferQueue.removeFirst() } } guard let chunk = data else { print("⚠️ No data to process") continue } if let buffer = self.pcmBufferFromData(chunk) { self.scheduledBufferCount += 1 self.playerNode?.scheduleBuffer(buffer, completionHandler: { self.pcmQueue.async { self.scheduledBufferCount -= 1 if self.bufferQueue.isEmpty && self.scheduledBufferCount == 0 { print("ℹ️ Playback idle - waiting for more data") self.isPlaying = false } } }) } } } } private func pcmBufferFromData(_ data: Data) -> AVAudioPCMBuffer? { guard let format = self.format else { return nil } let frameCount = UInt32(data.count / 2) guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCount) else { print("❌ Failed to create AVAudioPCMBuffer") return nil } buffer.frameLength = frameCount guard let floatChannelData = buffer.floatChannelData?[0] else { print("❌ floatChannelData is nil") return nil } data.withUnsafeBytes { (rawBuffer: UnsafeRawBufferPointer) in let int16Buffer = rawBuffer.bindMemory(to: Int16.self) let count = min(int16Buffer.count, Int(frameCount)) for i in 0..<count { floatChannelData[i] = Float32(int16Buffer[i]) / Float32(Int16.max) } } return buffer } @objc(stopPlayer) func stopPlayer() { pcmQueue.async { self.stopInternal() } } private func stopInternal() { print("🛑 stopInternal called") self.playerNode?.stop() self.engine?.stop() self.engine?.reset() self.playerNode = nil self.engine = nil self.format = nil self.bufferQueue.removeAll() self.isPlaying = false self.hasEnded = true self.scheduledBufferCount = 0 } @objc(canWrite:rejecter:) func canWrite(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { pcmQueue.async { resolve(self.bufferQueue.count < 20) } } @objc(flushPlayer:rejecter:) func flushPlayer(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { pcmQueue.async { self.bufferQueue.removeAll() resolve(nil) } } @objc static override func requiresMainQueueSetup() -> Bool { return false } private func queueSize() -> Int { return pcmQueue.sync { return self.bufferQueue.reduce(0) { $0 + $1.count } } } } I couldn't able to hear any audio via my real iOS device also it is working fine on emulator.
Replies
0
Boosts
0
Views
363
Activity
Jul ’25
Fairplay 4k streams decode errors - no video, audio only
HLS live streaming 4k is not displaying any video, but is streaming audio. Getting the following errors in the console where it shows that it is failing to decode every frame. Can I get some help as to what these error codes refer to and why it would fail to decode? 08:30:42.675879-0800 videocodecd AppleAVD: AppleAVDDecodeFrameInternal(): avdDec - Frame# 3588, DecodeFrame failed with error: 0x196 08:30:42.675908-0800 videocodecd AppleAVD: AppleAVDDisplayCallback(): Asking fig to drop frame # 3588 with err -12909 - internalStatus: 315 08:30:42.697412-0800 videocodecd AppleAVD: AppleAVDDecodeFrameResponse(): Frame# 3589 DecodeFrame failed with error 0x00000196 08:30:42.697876-0800 videocodecd AppleAVD: AppleAVDDecodeFrameInternal(): failed - error: 406
Replies
0
Boosts
0
Views
487
Activity
Dec ’24
Issue in playing fairplay video
We have to play some encrypted videos from server. In AVAssetResourceLoaderDelegate we got the ckc data correctly and responded with that. Then video just starts playing and stops immdediately. When we check the playerItem error description we got Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo={NSLocalizedDescription=Cannot Complete Action, NSLocalizedRecoverySuggestion=Try again later.}. Any one encountered this?
Replies
0
Boosts
0
Views
698
Activity
Dec ’23
Hide subtitle track or audio track on the AirPlay device
Hello I have a HLS manifest with multiple audio and multiple subtitle tracks. I use AVPlayer on iOS to play this HLS asset. On the iOS app I have the freedom to display selective subtitle and audio track list to the user but when the user uses AirPlay on the iOS, all the subtitle and audio tracks available in the HLS manifest is displayed to the user on the Apple TV (or any AirPlay compatible device). Let me explain with one example. Say, the HLS manifest has the following tracks: English, Spanish & German audio tracks English, Italian, Spanish & German subtitle tracks When the user uses AirPlay, I want to hide German language and display only the following tracks on the Apple TV: English & Spanish audio tracks English, Italian & Spanish subtitle tracks The primary intent here is that the user should not be able to see German language anywhere on the target AirPlay device. How to achieve this in code? Note: It's difficult to modify the source HLS manifest file.
Replies
0
Boosts
0
Views
1.5k
Activity
Jun ’22
How to pause HLS live using AV-Player
Used the PreferredForwardBufferDuration, this also after 2 - 3 minutes unable to pause the video, its catching live if pause duration more than 2 -3 minutes. Example:  [self.player.currentItem setPreferredForwardBufferDuration:60];   self.player.automaticallyWaitsToMinimizeStalling = YES;  self.player.currentItem.canUseNetworkResourcesForLiveStreamingWhilePaused = NO; How to stop buffering the AV-Player during pause state How to clear the AV-Player buffer during pause. SeekToTime is not working properly for live channel, I want to seek just one/two sec back. With SeekToTime if av-player unable to seek to previous time line its catching the future position. Manifest providing to av-player, #EXT-X-VERSION:4 #EXT-X-TARGETDURATION:1 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-KEY:METHOD=AES- http://ServerAddress/f1655359642.ts #EXT-X-KEY:METHOD=AES- http://ServerAddress/f1655359643.ts #EXT-X-KEY:METHOD=AES- #EXTINF:0.984, http://ServerAddress/f1655359644.ts
Replies
0
Boosts
0
Views
1.2k
Activity
Jun ’22
### HEVC/H.265 playback works on iPhone 13 and iPhone 15 but fails on iPhone X and iPhone 17 Pro Max
Hi Apple Developer Community, I’m investigating an HEVC/H.265 playback issue in an iOS application and would appreciate some guidance regarding device-level HEVC compatibility and AVFoundation/VideoToolbox behavior. Our application plays video content encoded in both H.264 and H.265 (HEVC). Current observations The same H.265 video content produces the following results: Device H.264 H.265 iPhone X Works Does not play iPhone 13 Works Works iPhone 15 Works Works iPhone 17 Pro Max Works Does not play H.264 playback works consistently across all tested devices. The interesting part is that H.265 works on the iPhone 13 and iPhone 15, but does not work on either the older iPhone X or the newer iPhone 17 Pro Max. This makes me unsure whether the issue is related to the device's HEVC hardware decoder, a specific HEVC profile/level/pixel format, codec/container signaling, or the playback framework. Questions Are there known differences in HEVC/H.265 decoding capabilities or supported profiles between these iPhone generations that could explain this behavior? Can a newer device such as the iPhone 17 Pro Max have compatibility limitations with a particular HEVC stream that successfully plays on an iPhone 13 or iPhone 15? Are there specific HEVC parameters that I should compare when troubleshooting this, such as: HEVC profile (Main / Main 10) Level and tier 8-bit vs 10-bit Pixel format Chroma subsampling (4:2:0 / 4:2:2) Resolution and frame rate Bitrate HDR10 / HLG / SDR Color primaries / transfer characteristics hvc1 vs hev1 MP4/fMP4 vs MPEG-TS container Audio codec Is there an Apple-recommended API or method to determine at runtime whether a particular HEVC stream is supported by the current device before attempting playback? If using AVPlayer/AVPlayerItem, what is the recommended way to diagnose whether a failure is caused by: Unsupported HEVC characteristics VideoToolbox decoding Container/codec signaling Audio decoding AVFoundation Network/streaming configuration? Are there any differences in HEVC support between local MP4 playback and HLS/fMP4 playback that I should take into account? Additional investigation I am planning to inspect the exact video characteristics using ffprobe/MediaInfo and compare a working stream against a failing stream. For example, I intend to compare: Codec Codec tag (hvc1 / hev1) Profile Level Tier Bit depth Pixel format Resolution Frame rate Bitrate Chroma subsampling Color space HDR metadata Container Audio codec I will also test the same video outside the application to determine whether this is specific to our playback implementation or to the HEVC stream/device combination. Main question The main thing I would like to understand is: How can the same H.265 content be successfully decoded on an iPhone 13 and iPhone 15, while failing on both an older iPhone X and a much newer iPhone 17 Pro Max? Is there an Apple-documented compatibility matrix or recommended diagnostic approach for identifying which HEVC characteristic is responsible for this behavior? Any guidance on the relevant Apple documentation, AVFoundation APIs, VideoToolbox APIs, or known device-specific HEVC limitations would be greatly appreciated. Thank you.
Replies
0
Boosts
0
Views
157
Activity
Sep ’26
Where can I get the private key to decrypt SPC requested from safari on Mac OS?
Hi, We are trying to adopt FPS for mp4 content protection playing on safari browser of Mac OS. I have verified that native functions of safari browser support the decryption for AES-128 encrypted TSs based on EME of HTML5 and HLS mechanism, where the CEK stores in http server described in the m3u8 manifest and is delivered to the browser in plain. Although it is a simple and easy solution to protect the mp4 contents, the security is still matter because the key is delivered in plain. So we decided to implment a key server to issue the CKC message after receiving SPC as safari browser's key request. I have a question before starting it. Q: The Encrypted AES-128 key in the Table 2-3. SPC container structure of FairPlay Streaming Programming Guide document says that "This key is itself encrypted, using RSA public key encryption with Optimal Asymmetric Encryption Padding (OAEP)". It means we needs a private key to decrypt it. I understand it if the client is a proprietary application so that the public key would be one of the FPS development credential, which will be issued by Apple according to our request. Because the client application can use the public key during the implementation. But what if the client is the safari browser? We cannot use any kind of new issued public key for the safari browser. I guess Mac OS uses some fixed public key which is already issued by Apple for safari browser's FPS. Now how can I get the counter private key? It could not be contained in the FPS credential. Because it should be a fixed one, not new generated one.
Replies
0
Boosts
0
Views
848
Activity
Jun ’22
Does HLS support MVHEVC HDR10 ?
I am setting up a HLS server for MVHEVC files... just find that if tag mp4 files using Asset Writer with let colorPropertySettings = [ AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_709_2, AVVideoYCbCrMatrixKey: AVVideoTransferFunction_ITU_R_709_2, AVVideoTransferFunctionKey: AVVideoYCbCrMatrix_ITU_R_709_2 ] the HLS playback well on Safari. but if tag mp4 files using using Asset Writer with let colorPropertySettings = [ AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_2020, AVVideoYCbCrMatrixKey: AVVideoYCbCrMatrix_ITU_R_2020, AVVideoTransferFunctionKey: AVVideoTransferFunction_SMPTE_ST_2084_PQ ] the HLS can not play on Safari. looks like HLS does NOT support MVHEVC HDR10. OR have I lost any setting for MVHEVC HDR10? thanks.
Replies
0
Boosts
0
Views
630
Activity
May ’24
MusicKit for Android - support or cancel it
We all know the state of MusicKit SDK for Android is catastrophic - it's buggy, it's lacking features and it has not been updated in ages. It's sad though, as on Android there is (and this came as quite a surprise to me) no real alternative if you want to build an app with music content from a streaming service. So why, really why, does Apple not do anything in this area? Just give us an updated version of the SDK and we can continue on building apps that work on iOS and on Android.
Replies
0
Boosts
0
Views
276
Activity
5d
Video Streaming Site and working with Safari Autoplay Policy
Hello all, I am currently developing a video streaming site and am currently working on the video player. The site will be serving video content using HLS given that this will be quite sizable and long video content. Given that the main functionality of the site is to watch streaming video, when a user clicks on a video to watch, when the video player page opens, the desire is to have the video start playing automatically with sound. Safari autoplay policy basically rejects attempts to autoplay video content with audio unless the audio starts muted, otherwise, the user needs to interact with the player in order to start the video playing with audio unmuted. Given that the main purpose of the site is to watch these videos, it would be hugely detrimental to require the user to interact with the player to either start playing the video, or to unmute it. Many sites such as YouTube, Twitch, and others obviously have autoplay functionality that works as I would expect for a video-centric site in Safari. Given their size, I imagine they have some agreement with Safari team to have their site pre-authorized to allow autoplay with audio. How do I go about doing this? Hoping someone might be able to share some information that would be useful to ensure I can have things configured correctly such that my Safari users won't have to suffer having to manually start playing, or turn on their audio in order to enjoy the videos the same way Chrome and Firefox users will automatically. Thanks!
Replies
0
Boosts
0
Views
878
Activity
Jul ’22
ScreenCaptureKit stops capturing after ~10–15 minutes unexpectedly
When using the built-in macOS screen recording feature, the recording stops automatically after approximately 10–15 minutes without any warning or error message. No manual stop action is performed. The recording simply ends silently. The same issue also occurs when using ScreenCaptureKit in a custom application, which suggests this may be a system-level issue related to screen capture rather than an app-specific problem. This issue is reproducible and happens consistently after running for a period of time.
Replies
0
Boosts
0
Views
576
Activity
Apr ’26
Feasibility and Privacy Concerns for App Monitoring and Blocking 3rd Party Apps on iOS
Hello, I am interested in developing an iOS app that can monitor and potentially block third-party applications while a specific app is running. I would like to inquire about the feasibility of implementing such functionality within the iOS ecosystem and if there are any privacy terms or restrictions that I need to be aware of to ensure compliance with Apple's policies. Thank you for your guidance.
Replies
0
Boosts
0
Views
609
Activity
Sep ’23
Technical guidance request: native screen capture protection on macOS with Flutter while allowing AirPlay
Hello Apple Developer Support, I am reaching out for technical guidance regarding screen capture protection behavior on macOS. We are building a desktop application using Flutter running on macOS, and we have implemented native Swift code inside the macOS Runner in order to protect sensitive content from screen recording and screen sharing. Our current implementation relies on native window-level protection and display state handling from Swift, while the main UI remains rendered by Flutter. The main challenge we are facing is the following: we need to keep a strong native anti-recording protection on macOS the application is heavily used with AirPlay and screen mirroring currently, AirPlay / mirroring is often interpreted by the system similarly to screen capture or screen recording this causes our protected content to be replaced by a gray or blank area even during legitimate AirPlay usage In practice, we would like to allow: AirPlay legitimate external display / mirroring usage while still preventing: screen recording screen sharing unauthorized screen capture We would like to know whether Apple recommends an official supported approach for this use case, preferably using public APIs. More specifically: Is there an officially supported way on macOS to distinguish AirPlay mirroring from screen recording / screen sharing? Is "NSWindow.sharingType" the recommended public API for this scenario? Is there a recommended approach when the UI surface is rendered through Flutter / Metal? Are there any best practices with ScreenCaptureKit for protecting content without affecting AirPlay? We understand that some lower-level APIs may not be officially supported, so we would greatly appreciate guidance toward a public and future-proof implementation path. Thank you very much for your time and support. Best regards, Tony
Replies
0
Boosts
0
Views
888
Activity
Apr ’26
How can I create a Clear key HLS using Shaka-Packager
Hello, I'm try to create a working Clear-key HLS stream using Shaka-packager. Shaka packager support only SAMPLE-AES. when implemented, it's looks like the resulting stream is no't playable in Safary browser. This is the example M3U8 file starts: #EXTM3U #EXT-X-VERSION:6 ## Generated with https://github.com/google/shaka-packager version v2.6.1-634af65-release #EXT-X-TARGETDURATION:13 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-MAP:URI="audio_und_2c_128k_aac_init.mp4" #EXT-X-KEY:METHOD=SAMPLE-AES,URI="https://www.httpstest.com:771/key.key",IV=0x00000000000000000000000000000000,KEYFORMAT="identity" #EXTINF:10.008, audio_und_2c_128k_aac_1.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_2.mp4 #EXTINF:9.985, audio_und_2c_128k_aac_3.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_4.mp4 #EXTINF:10.008, audio_und_2c_128k_aac_5.mp4 #EXTINF:9.985, audio_und_2c_128k_aac_6.mp4 #EXTINF:0.093, audio_und_2c_128k_aac_7.mp4 #EXT-X-ENDLIST I'm looking for: A. a working example of SAMPLE-AES Clear key encrypted HLS (so I will be able to learn from it how it should be defined for IOS) B. help on how to create a clear key working HLS stream for IOS/macOS (Safari)
Replies
0
Boosts
0
Views
1.1k
Activity
Sep ’23
SCK/replayd behaviors and delays
We're troubleshooting SCK issues. They occur with a relatively small amount of sessions, but lack of context and/or ability to advise the customer on how they could make behavior more predictable and reliable is problematic. Generally, there is 2 distinct issues which may or may not have the same root cause: Failure to establish SCK session. Usually manifests within the app as SCShareableContent.getWithCompletionHandler call either never invoking the completion handler, or taking prohibitively long time (we usually give it 3-10 sec before giving up). In the system log it may look like this: (log omitted - suspecting it triggers the content filter) Note the 6 seconds delay to completion of fetchShareableContentWithOption (normally it's a 30-40ms operation). Sometime, we'd see the stream established, but some minutes (or even hours) into the recording we'd stop receiving frames. Both scenarios are likely to occur when the disk space is low, with reliable repro of the problem #2 at below 8gb of free space (in that case, we've seen replayd silently dropping the session, without ever notifying the client ... improving API could go a long way there). However, out of recent occurrences, while most have less than 100GB available, we've seen it on machines with as much as 500GB free. Unfortunately, it's almost never reproducible in dev environment, so we have to rely on diagnostics we're able to collect in the field -- which nothing obvious yet. I'd like to understand the root cause of both scenarios better and/or how what specific frameworks can cause these behaviors.
Replies
0
Boosts
0
Views
842
Activity
Jan ’26
Unreliable offline playback of HLS stream
Hello all, I recently encountered a problem similar to what has been asked here (sadly no answer): https://developer.apple.com/forums/thread/127808?login=true When downloading an HLS stream via an aggregate task (regardless if I set it to use preferred, or all media selections) I get an error on offline playback. If my device is connected, all seems to work ok. Upon inspection of the boot.xml in the .movpkg file, I can see some streams report <Complete>NO</Complete></Stream> I cannot quite work out why this is. Before playback the resultant AVURLAsset's status is not ready. The movie has multiple audio and a single subtitle and video tracks. It is important to mention, playback seems to work for some of my test videos. I also use a VPN. Any assistance would be much appreciated.
Replies
0
Boosts
0
Views
1.1k
Activity
Aug ’22