我已经完成了我的作业......一直在这里阅读,文档,谷歌搜索,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.
任何人有什么建议我应该做什么?
我有一个播放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必须被创建和加载等等,所以如果你认为这是唯一可行的解决方案(我们希望这将达到我们想要的结果 - 即每一章都会准确地开始我们想要的地方)随意说出来.
提前致谢!
当我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网址.任何想法如何沉默运行时错误?
首先是关于应用程序的一些背景信息......
- 有很多涉及视频播放器的大量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) 我的应用程序中有以下代码:
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) 我正在尝试从捆绑目录播放视频,但我收到此错误:
视频[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中搜索时,我们的视频会缓冲很多.它比我们的网络播放器缓冲得更多,它可以在临时存储中保存已经观看的片段的副本.
期望的解决方案
在设备的磁盘上本地缓存视频片段.我们很好地缓存单一质量并且总是重播它.
拦截器
我们找不到在AVFoundation/AVPlayer中执行缓存的方法.
我们尝试过什么
使用AVPlayer拦截网络请求的两种方法.
不适用于HLS.您可以通过实现AVAssetResourceLoaderDelegate来加载m3u8文件,它允许您通过身份验证或解密响应,但无法加载.ts文件.这是我们尝试的代码:https: //gist.github.com/nathanhillyer/84e46152d7c4c88183b6
.ts文件请求.AVURLAsset实际上避免被截获.不知何故,网络请求只是没有被捕获.(不知道为什么)
avfoundation video-streaming http-live-streaming ios avplayer
我想检测我的AVPlayer是否正在缓冲当前位置,以便我可以显示加载器或其他东西.但我似乎无法在AVPlayer的文档中找到任何内容.
我正在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) avplayer ×10
ios ×10
avfoundation ×2
ios7 ×2
iphone ×2
swift ×2
avasset ×1
avplayerview ×1
background ×1
buffering ×1
ipad ×1