标签: avplayer

当应用程序处于后台时,如何让我的AVPlayer播放?

我已经完成了我的作业......一直在这里阅读,文档,谷歌搜索,stackoverflowing ...但是当用户让应用程序进入后台时,仍然没有运气使我的声音棒.

到目前为止我做了什么:在plist文件中添加了UIBackgroundModes,音频.

首先这段代码:

radioAudio = [[AVAudioSession alloc] init];
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil];
[radioAudio setActive:YES error:nil];
Run Code Online (Sandbox Code Playgroud)

然后这个:

NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u";
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain];
Run Code Online (Sandbox Code Playgroud)

但是一旦用户点击主页按钮,我的声音就会消失.

我也找到了这个,但是还没有添加,但是我读过的一些东西说它不需要;

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
     if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;
Run Code Online (Sandbox Code Playgroud)

现在我不知道我应该去哪里让我的AVPlayer让用户在手机上做其他东西时收听广播.我在带有4.2的iPhone 4上进行测试.构建它为4.0.

任何人有什么建议我应该做什么?

iphone background ios avplayer

29
推荐指数
4
解决办法
4万
查看次数

AVPlayer seekToTime无法在正确的位置播放

我有一个播放HLS视频流的AVPlayer.我的用户界面提供了一行按钮,一个用于视频中的每个"章节"(按钮标记为"1","2","3").该应用程序从服务器下载一些元数据,该服务器包含以秒表示的章节切入点列表.例如,一个视频的长度为12分钟 - 章节切入点的列表为0,58,71,230,530等,等等.

当用户点击其中一个"章节按钮"时,按钮处理程序代码执行以下操作:

            [self.avPlayer pause];

    [self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600) 
              toleranceBefore: kCMTimeZero 
               toleranceAfter: kCMTimeZero 
            completionHandler: ^(BOOL finished) 
            {
                [self.avPlayer play];
            }];
Run Code Online (Sandbox Code Playgroud)

其中"seekTime"是包含切入点的局部变量(如上所述).

问题是视频并不总是从正确的点开始.有时确实如此.但有时它会在请求的seekTime之前的任何时间从十分之一秒到2秒.它永远不会在请求的seekTime之后启动.

以下是视频编码的一些统计信息:

编码器:handbrakeCLI编解码器:h.264帧率:24(实际上,23.976 - 与拍摄方式相同)视频比特率:多比特率(64/150/300/500/800/1200)音频比特率:128k关键帧:23.976(每秒1次)

我当然使用Apple mediafilesegmenter工具和variantplaylistcreator来生成播放列表.

这些文件是从Amazon Cloud/S3存储桶提供的.

我仍然不清楚的一个领域是CMTimeMakeWithSeconds - 我已经根据我读过的不同文章/文档尝试了几种变体.例如,在上面的摘录我使用:

CMTimeMakeWithSeconds(seekTime,600)

我也尝试过:

CMTimeMakeWithSeconds(seekTime,1)

我不知道哪个是正确的,虽然两个似乎产生相同的不一致结果!

我也尝试过:

CMTimeMakeWithSeconds(seekTime,23.967)

有些文章声称这就像分子/分母一样,所以n/1应该是正确的,其中'n'是秒数(如CMTimeMakeWithseconds(n,1)).但是,代码最初是由一个不同的程序员(现在已经不在了)创建的,他使用600数字作为preferredTimeScale(即CMTimeMakeWithseconds(n,600)).

任何人都可以提供任何关于我做错的线索,或者即使我想要实现的那种准确性甚至可能吗?

如果有人想要提供"替代"解决方案,我们已经在考虑将视频分成不同的流,每章一个,但我们不相信这会给我们带来相同的性能,因为更改章节需要更长的时间因为新的AVPlayerItem必须被创建和加载等等,所以如果你认为这是唯一可行的解​​决方案(我们希望这将达到我们想要的结果 - 即每一章都会准确地开始我们想要的地方)随意说出来.

提前致谢!

video-streaming ios avplayer

29
推荐指数
2
解决办法
2万
查看次数

来自AVPlayer的错误= -25300

当我AVPlayerItem(url: customUrl)从我的应用程序使用时,我得到以下运行时错误:

CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
    class = inet;
    "m_Limit" = "m_LimitAll";
    "r_Attributes" = 1;
    sync = syna;
}
Run Code Online (Sandbox Code Playgroud)

该错误是无害的,它只是阻止我的控制台.有趣的是我只从主应用程序中获取此错误,而不是从完全相同代码所在的键盘扩展名中获取此错误.应该注意我正在访问带有.mp3文件的https网址.任何想法如何沉默运行时错误?

ios avplayer swift

29
推荐指数
1
解决办法
3122
查看次数

AVPlayerItem replaceCurrentItemWithPlayerItem阻塞

首先是关于应用程序的一些背景信息......
- 有很多涉及视频播放器的大量UI操作(主要是滚动)
- 视频是动态的,并根据我们当前的页面进行更改.
- 因此视频必须是动态的并且不断变化,并且UI需要响应

我最初使用a MPMoviePlayerController但是由于某些要求我必须回到AVPlayer
上我自己制作了包装器AVPlayer.
要更改videoPlayer中的内容,这是AVPlayer-wrapper类中的方法

/**We need to change the whole playerItem each time we wish to change a video url */
-(void)initializePlayerWithUrl:(NSURL *)url
{
    AVPlayerItem *tempItem = [AVPlayerItem playerItemWithURL:url];

    [tempItem addObserver:self forKeyPath:@"status"
                  options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                  context:nil];
    [tempItem addObserver:self forKeyPath:@"playbackBufferEmpty"
                  options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                  context:nil];

    //Not sure if this should be stopped or paused under the ideal circumstances
    //These will be changed to custom enums later
    [self setPlaybackState:MPMoviePlaybackStateStopped];
    [self setLoadState:MPMovieLoadStateUnknown];
    [self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem]; …
Run Code Online (Sandbox Code Playgroud)

iphone mpmovieplayercontroller ipad ios avplayer

28
推荐指数
1
解决办法
6840
查看次数

iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确

我的应用程序中有以下代码:

NSURL *url = [NSURL fileURLWithPath: [self.DocDir stringByAppendingPathComponent: self.FileName] isDirectory: NO];
self.avPlayer = [AVPlayer playerWithURL: url];

Float64 duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);
Run Code Online (Sandbox Code Playgroud)

这适用于iOS 6,但由于某种原因,iOS 7会返回NaN.检查self.avPlayer.currentItem.duration时,CMTime对象的值为0,标志为17.

有趣的是,玩家工作正常,只是持续时间是错误的.

还有其他人遇到过同样的问题吗?我正在导入以下内容:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVAsset.h>
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avplayer avasset ios7

28
推荐指数
3
解决办法
2万
查看次数

Swift:AVPlayer播放视频显示此错误:[AVOutputContext]警告:AVF上下文不可用于sharedAudioPresentationContext

我正在尝试从捆绑目录播放视频,但我收到此错误:

视频[29054:2968406] [MediaRemote] [AVOutputContext]警告:AVF上下文不可用于sharedAudioPresentationContex

这是我的实施:

import UIKit
import AVKit
import AVFoundation


class ViewController: UIViewController {
    var playerVC = AVPlayerViewController()
    var playerView = AVPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.playVideo()

    }


    func playVideo() {
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! as NSURL
        guard let fileURL  = documentsDirectory.appendingPathComponent("video.mp4") else{ return }
        self.playerView = AVPlayer(url:fileURL as URL)
        self.playerVC.player = playerView
        self.view.addSubview(self.playerVC.view)
        self.addChildViewController(self.playerVC)
        playerView.play()

    }
Run Code Online (Sandbox Code Playgroud)

你们中的任何人都知道我做错了什么?我真的很感激你的帮助.

ios avplayer swift avplayerview avplayerviewcontroller

28
推荐指数
1
解决办法
5029
查看次数

是否可以使用AVPlayer缓存HLS段?

根本问题

在iOS中搜索时,我们的视频会缓冲很多.它比我们的网络播放器缓冲得更多,它可以在临时存储中保存已经观看的片段的副本.

期望的解决方案

在设备的磁盘上本地缓存视频片段.我们很好地缓存单一质量并且总是重播它.

拦截器

我们找不到在AVFoundation/AVPlayer中执行缓存的方法.

我们尝试过什么

使用AVPlayer拦截网络请求的两种方法.

  1. 符合AVAssetResourceLoaderDelegate并手动处理媒体加载

不适用于HLS.您可以通过实现AVAssetResourceLoaderDelegate来加载m3u8文件,它允许您通过身份验证或解密响应,但无法加载.ts文件.这是我们尝试的代码:https: //gist.github.com/nathanhillyer/84e46152d7c4c88183b6

  1. 实现NSURLProtocol以捕获.ts文件请求.

AVURLAsset实际上避免被截获.不知何故,网络请求只是没有被捕获.(不知道为什么)

avfoundation video-streaming http-live-streaming ios avplayer

27
推荐指数
1
解决办法
8210
查看次数

如何检查我的AVPlayer是否正在缓冲?

我想检测我的AVPlayer是否正在缓冲当前位置,以便我可以显示加载器或其他东西.但我似乎无法在AVPlayer的文档中找到任何内容.

buffering ios avplayer

27
推荐指数
7
解决办法
2万
查看次数

来电后AV播放器恢复正常

我正在AVPlayer用于音乐播放.我的问题是,在来电后,播放器将无法恢复.来电时如何处理此问题?

ios avplayer avplayerlayer ios7

26
推荐指数
2
解决办法
1万
查看次数

播放视频时,avplayer没有声音

这是我的所有代码播放mp4,mp4播放但没有声音

import UIKit

import AVFoundation
class ViewController: UIViewController {

@IBOutlet weak var containerView: UIView!

var playerLayer:AVPlayerLayer!
var player:AVPlayer!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let path = NSBundle.mainBundle().pathForResource("huoguo", ofType: "mp4")
    let url = NSURL(fileURLWithPath: path!)
    let asset = AVAsset(URL: url)
    let playerItem = AVPlayerItem(asset: asset)
    self.player = AVPlayer(playerItem: playerItem)
    self.playerLayer = AVPlayerLayer(player: player)
    self.playerLayer.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.width * 9 / 16)
    self.containerView.layer.addSublayer(playerLayer)
    //self.playerLayer.player?.volume = 1
    self.playerLayer.player?.play() …
Run Code Online (Sandbox Code Playgroud)

ios avplayer

25
推荐指数
4
解决办法
9218
查看次数