iOS:修改服务器对 AVPlayer 的响应或如何提供 MIME 类型

问题描述 投票:0回答:3

我正在尝试从服务器播放视频文件,该文件在模拟器中播放,但在实际设备中不播放。当项目的状态更改(失败)时,错误消息为:

错误域=AVFoundationErrorDomain代码=-11828“无法打开” UserInfo=0x15542db0 {NSLocalizedDescription=无法打开, NSUnderlyingError=0x156f49f0“操作无法完成。 (OSStatus 错误 -12847。)", NSLocalizedFailureReason=此媒体格式 不支持。}

我在这个问题中读到,文件应该有扩展名,或者服务器应该使用正确的 mime 类型进行回复,但是在这种情况下,这两种情况都是不可能的。

我想知道是否有办法通过 AVPlayer 或 MPMoviePlayerController 以编程方式修改服务器响应或提供 mime 类型。预先感谢您。

ios mpmovieplayercontroller avplayer
3个回答
2
投票

2
投票

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


0
投票

这是 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))
© www.soinside.com 2019 - 2024. All rights reserved.