AVPlayer抛出异常:"内部错误:重启太过频繁"

8
我正在观察AVPlayer的KVO AVPlayerItemNewErrorLogEntryNotification,发现以下错误:
errorStatusCode:-12645 errorDomain:CoreMediaErrorDomain errorComment:Internal error: restarting too far ahead (-1.4084s)
我无法理解下面这行话的真正含义。
“内部错误:重新启动时间过长”
有人能帮我找到这个问题的根本原因吗?

你可能想要将产生错误的代码和错误一起发布。 - Adrian
@AdrianB,我正在播放一段实时视频,发现某些视频的错误日志。我相信代码没有问题,想知道这是否是我正在播放的视频的问题。只是想知道这个错误的真正含义。 - karthik
你能发布一个帖子来帮助复制这个错误吗? - xvan
@xvan,我无法发布它,因为它是DRM保护的,并且流被加密了。 - karthik
3个回答

12

如果长时间的.ts视频文件响应为:-12645。

MPMediaPlayer在MPMovieErrorLogEvent类中返回的错误状态码没有文档记录。但其中一些包括:

HTTP status - errorStatusCode - errorDomain - errorComment

400     -12666  CoreMediaErrorDomain    unrecognized http response 400  
401     -12937  CoreMediaErrorDomain    Authentication Error    
402     -12666  CoreMediaErrorDomain    unrecognized http response 402  
403     -12660  CoreMediaErrorDomain    HTTP 403: Forbidden     
404     -12938  CoreMediaErrorDomain    HTTP 404: File not found    
405     -12666  CoreMediaErrorDomain    unrecognized http response 405  
406     -12666  CoreMediaErrorDomain    unrecognized http response 406  
407     -12937  CoreMediaErrorDomain    Authentication Error    
409     -12666  CoreMediaErrorDomain    unrecognized http response 409  
...                 
415     -12666  CoreMediaErrorDomain    unrecognized http response 415  

500     -12666  CoreMediaErrorDomain    unrecognized http response 500  
501     -12666  CoreMediaErrorDomain    unrecognized http response 501  
502     -12666  CoreMediaErrorDomain    unrecognized http response 502  
503     -12661  CoreMediaErrorDomain    HTTP 503: Unavailable   
504     -12666  CoreMediaErrorDomain    unrecognized http response 504  
505     -12666  CoreMediaErrorDomain    unrecognized http response 505  

if long .ts video file respons  -12645  CoreMediaErrorDomain    No response for media file in 10 s  

video .ts file bitrate differ from m3u8 declaration     -12318  CoreMediaErrorDomain    Segment exceeds specified bandwidth for variant     

for live stream.playlist m3u8 did not change too long   -12642  CoreMediaErrorDomain    Playlist File unchanged for 2 consecutive reads     

if wrong host ip    -1004   kCFErrorDomainCFNetwork     -   

if wrong dns host name  -1003   kCFErrorDomainCFNetwork     -   

if bad formatted URL    -1000   kCFErrorDomainCFNetwork     -   

if invalid https/ssl request    -1202   kCFErrorDomainCFNetwork     -

3
谢谢回复,请问您得知“如果长的.ts视频文件响应”这一信息的来源是什么? - karthik
你知道 CoreMediaErrorDomain error -12155 吗? - Amir Shabani

5
根据一名苹果员工的说法,此错误信息表示:播放器正在抱怨尝试重新启动直播流,但仅有1.4秒的素材可用。您的直播播放列表中有多少个片段?现在我们建议您在播放列表中始终至少有六个片段。我认为唯一的影响是延迟播放,直到它有足够的数据。
引用来源:https://forums.developer.apple.com/thread/40791 造成该错误的原因很可能源于 m3u8 文件本身。
当实时传输节目(例如任何电视频道)时,事件数据的可用性和编码器创建的媒体段 (.ts) 附加到播放列表之间存在延迟。
我可以想象如果播放器项播放头位置位于缓冲区的边缘,并且新媒体片段在服务器上没有足够快地提供,将会生成这些类型的错误。
这些错误是否应该在客户端处理或预防:
由于这些错误被报告为“内部”的,并且 AVPlayer 显然从中恢复过来,因此可以安全地假设它们正在内部处理。因此,它们可以被理解为简单的错误报告,并且可以选择忽略它们。
如果想要预防它们,唯一的方法可能是手动将实时缓冲区的边缘时间向后调整几秒钟。

1
手动将实时缓冲区边界向后设置几秒钟,这是什么意思?考虑到第一段的内容,我认为这不是客户端的修改。 - vma_93
这意味着您不应该让直播流真正地实时运行(即将缓冲区指向m3u8的最后一个.ts),而是要设置偏移量,以便为写入m3u8的更新可能存在的延迟留出时间。我意识到我的回答是基于假设OP在其直播流中使用了缓冲区,其中可以向前或向后查找。这是产品特定的。 如果您的产品不使用缓冲区,请将“手动将直播缓冲区边缘设置回几秒钟之前”替换为“手动将播放头设置回几秒钟之前”。 - schmittsfn

0
根据本杰明的回答,以及根据我对AVFoundation的经验,您可以使用以下代码将AVPlayeritem的底层错误转换为CoreMediaError,适用于大多数常见情况。
public enum CoreMediaError:Error {
    
    static let domain = "CoreMediaErrorDomain"
    
    case unknown
    case notFound
    case unauthorized
    case authenticationError
    case forbidden
    case unavailable
    case mediaFileError
    case bandwidthExceeded
    case playlistUnchanged
    case decoderMalfunction
    case decoderTemporarilyUnavailable
    case wrongHostIP
    case wrongHostDNS
    case badURL
    case invalidRequest
    case unrecognizedHttpResponse
    
    init?(_ error:NSError){
        
        guard error.domain == CoreMediaError.domain else {return nil}
        
        switch error.code {
        case -12937:
            // HTTP: 401     -12937  CoreMediaErrorDomain    Authentication Error
            // HTTP: 407     -12937  CoreMediaErrorDomain    Authentication Error
            self = .authenticationError
        case -16840:
            self = .unauthorized
        case -12660:
            // HTTP: 403     -12660  CoreMediaErrorDomain    HTTP 403: Forbidden
            self = .forbidden
        case -12938:
            //HTTP: 404     -12938  CoreMediaErrorDomain    HTTP 404: File not found
            self = .notFound
        case -12661:
            //HTTP: 503     -12661  CoreMediaErrorDomain    HTTP 503: Unavailable
            self = .unavailable
        case -12645, -12889:
            //   if long .ts video file respons  -12645  CoreMediaErrorDomain    No response for media file in 10 s
            //   https://developer.apple.com/forums/thread/5589
            self = .mediaFileError
        case -12318:
            //  video .ts file bitrate differ from m3u8 declaration     -12318  CoreMediaErrorDomain    Segment exceeds specified bandwidth for variant
            self =  .bandwidthExceeded
        case -12642:
            //  for live stream.playlist m3u8 did not change too long   -12642  CoreMediaErrorDomain    Playlist File unchanged for 2 consecutive reads
            self =  .playlistUnchanged
        case -12911:
            self =  .decoderMalfunction
        case -12913:
            self =  .decoderTemporarilyUnavailable
        case -1004:
            //  if wrong host ip    -1004   kCFErrorDomainCFNetwork
            self =  .wrongHostIP
        case -1003:
            //   if wrong dns host name  -1003   kCFErrorDomainCFNetwork
            self =  .wrongHostDNS
        case -1000:
            //   if bad formatted URL    -1000   kCFErrorDomainCFNetwork
            self =  .badURL
        case -1202:
            //   if invalid https/ssl request    -1202   kCFErrorDomainCFNetwork
            self =  .invalidRequest
        case -12666:
            //400     -12666  CoreMediaErrorDomain    unrecognized http response 400
            //402     -12666  CoreMediaErrorDomain    unrecognized http response 402
            //405     -12666  CoreMediaErrorDomain    unrecognized http response 405
            //406     -12666  CoreMediaErrorDomain    unrecognized http response 406
            //409     -12666  CoreMediaErrorDomain    unrecognized http response 409
            //...
            //415     -12666  CoreMediaErrorDomain    unrecognized http response 415
            //500     -12666  CoreMediaErrorDomain    unrecognized http response 500
            //501     -12666  CoreMediaErrorDomain    unrecognized http response 501
            //502     -12666  CoreMediaErrorDomain    unrecognized http response 502
            //504     -12666  CoreMediaErrorDomain    unrecognized http response 504
            //505     -12666  CoreMediaErrorDomain    unrecognized http response 505
            self =  .unrecognizedHttpResponse
        default:
            self =  .unknown
        }
    }
}

您还可以查看thisGitHub要点获取更多详情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接