m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?

Posted

技术标签:

【中文标题】m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?【英文标题】:m3u8 audio stream plays in MPMoviePlayerController but not AVPlayer? 【发布时间】:2014-03-31 21:00:16 【问题描述】:

我有点迷失了这个。我有一个类需要播放音频和视频文件或流。它有一个完全自定义的 UI,所以我为此使用 AVPlayer。

有一个实时音频流无法播放。每次AVPlayerItem观察者触发AVPlayerItemStatusFailed,AVPlayer的error为nil。

但是当我尝试在 MPMoviePlayerController 或 Safari 或 Chrome 中播放相同的音频流时,它工作得很好。这非常奇怪,因为 MPMoviePlayerController 在内部使用了 AVPlayer。

这是失败的实时音频流的 URL:http://bit.ly/1gIqjV6

我的 AVPlayer 代码(不适用于 URL)

_currentItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"http://bit.ly/1gIqjV6"]];
[self startObservingPlayerItem:self.currentItem];

_avPlayer = [[AVPlayer alloc] initWithPlayerItem:self.currentItem];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.currentItem];

AVPlayerItem 观察者

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context



    if ([object isEqual:[self.avPlayer currentItem]])
    
        if ([keyPath isEqualToString:@"status"])
        
            switch ([self.avPlayer currentItem].status) 
                case AVPlayerItemStatusReadyToPlay:

                    NSLog(@"AVPlayerItemStatusReadyToPlay");
                    break;

                case AVPlayerItemStatusFailed:

                    // The live audio stream always fails, error is always nil
                    NSLog(@"AVPlayerItemStatusFailed");
                    NSError* error = self.avPlayer.error; 
                    break;

                case AVPlayerItemStatusUnknown:

                    NSLog(@"AVPlayerItemStatusUnknown");
                    break;
            
        
    

使用 MPMoviePlayerController(与 URL 配合使用)

MPMoviePlayerViewController* controller = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:@"http://bit.ly/1gIqjV6"]];
[rootViewController presentViewController:controller animated:YES completion:nil];

有没有人遇到过这样的问题? 提前致谢。

【问题讨论】:

【参考方案1】:

看起来这是您的 m3u8 播放列表。我尝试了一个带有简单 AVPlayer 的空白项目,而测试流 ("http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8") 以及 your m3u8 文件中的 'hi' 和 'lo' 流工作,创建带有 m3u8 文件的 AVPlayerItem 总是失败。

m3u8中的diff如下:

你的:

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=35200, CODECS="mp4a.40.2"

苹果的样本:

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000

您还有其他 m3u8 播放列表要测试吗?

【讨论】:

感谢您的回复。 m3u8文件不是我自己生成的,是客户发给我们的。我开始查看文件并开始与我在网上找到的文档和其他 m3u8 文件进行比较。我原来的 m3u8 是这样开始的:#EXTM3U 这不起作用。但是,如果我只是在第一行添加一个 8:#EXTM3U8 它就可以了。我能找到的每个文档都使用#EXTM3U,Apple 的所有示例也是如此。仍然不知道对此的解释是什么。

以上是关于m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?的主要内容,如果未能解决你的问题,请参考以下文章

ios13音频流在后台被切断

HTML5 音频流在每首歌曲后停止

Android 的 MediaPlayer 的 m3u8 音频流问题

在H5页面播放m3u8音频文件

AUGraph 播放 aac->pcm 转换的音频流在 iPhone7plus 上听起来断断续续,但不是 iPhone6

m3u8格式的视频文件怎么转成Mp4在电脑上播放?