【问题标题】:iOS: Modify server response to AVPlayer or how to provide MIME typeiOS:修改服务器对 AVPlayer 的响应或如何提供 MIME 类型
【发布时间】:2014-01-04 06:11:11
【问题描述】:

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

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

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

我想知道是否可以通过 AVPlayer 或 MPMoviePlayerController 修改服务器响应或以编程方式提供 mime 类型。提前谢谢你。

【问题讨论】:

  • AFAIK AVPlayer 下面的网络层(因此也在MPMoviePlayerController 下面)对用户完全透明。因此,无法修改该层上的通信。我能看到的唯一解决方案是多个 YouTube 视频播放应用程序使用的本地代理。
  • @Till 你是说完全不透明吗?
  • @KyleRedfearn 确实我的意思是说完全不透明,ty。

标签: ios mpmovieplayercontroller avplayer


【解决方案1】:

我实现了一个带有自定义方案的 NSURLProtocol 来拦截调用并修改响应:

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSURLProtocol_Class/Reference/Reference.html

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      这里是 Swift 4.2 代码:

      let mimeType = "video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\""
      let asset: AVURLAsset = AVURLAsset(url: videoURL, options: ["AVURLAssetOutOfBandMIMETypeKey" : mimeType])
      let player = AVPlayer(playerItem: AVPlayerItem(asset: asset))
      

      【讨论】:

        猜你喜欢
        • 2019-11-08
        • 2011-04-29
        • 2022-11-09
        • 2021-05-08
        • 2016-04-16
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        相关资源
        最近更新 更多