我正在尝试从服务器播放视频文件,该文件在模拟器中播放,但在实际设备中不播放。当项目的状态更改(失败)时,错误消息为:
错误域=AVFoundationErrorDomain代码=-11828“无法打开” UserInfo=0x15542db0 {NSLocalizedDescription=无法打开, NSUnderlyingError=0x156f49f0“操作无法完成。 (OSStatus 错误 -12847。)", NSLocalizedFailureReason=此媒体格式 不支持。}
我在这个问题中读到,文件应该有扩展名,或者服务器应该使用正确的 mime 类型进行回复,但是在这种情况下,这两种情况都是不可能的。
我想知道是否有办法通过 AVPlayer 或 MPMoviePlayerController 以编程方式修改服务器响应或提供 mime 类型。预先感谢您。
我使用自定义方案实现了 NSURLProtocol 来拦截调用并修改响应:
WebKit 通过 Private AVURLAsset 选项处理此问题:
AVURLAssetOutOfBandMIMETypeKey
,当您在 HTML 的 video
标记中指定 MIME 类型时使用此选项,
您可以使用此选项,例如:
NSString * mimeType = @"video/mp4";
// or even with codecs
mimeType = @"video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"";
// create asset
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:url options:@{@"AVURLAssetOutOfBandMIMETypeKey": mimeType}];
// create AVPlayer with AVURLAsset
AVPlayer * player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
由于它是私钥,如果您打算将其提交到AppStore,您可能需要对其进行混淆。
WebKit 源代码可以在这里找到: https://opensource.apple.com/source/WebCore/WebCore-7604.1.38.1.6/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm.auto.html
这是 Swift 4.2 代码:
let mimeType = "video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\""
let asset = AVURLAsset(url: videoURL, options: ["AVURLAssetOutOfBandMIMETypeKey" : mimeType])
let player = AVPlayer(playerItem: AVPlayerItem(asset: asset))