我正在使用AVPlayer以下代码从Internet播放实时流:
NSString *u = @"http://192.192.192.192:8036";
NSURL *url = [NSURL URLWithString:u];
radiosound = [[AVPlayer alloc] initWithURL:url];
[radiosound play];
Run Code Online (Sandbox Code Playgroud)
我有一个按钮播放:
[radiosound play];
Run Code Online (Sandbox Code Playgroud)
和暂停:
[radiosound pause];
Run Code Online (Sandbox Code Playgroud)
我的问题是我只想使用一个按钮Play/Pause,但是当我使用这个代码时
if (radiosound.isPlaying) {
[radiosound pause];
} else {
[radiosound play];
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序崩溃,因为AVPlayer无法识别"isPlaying".
有小费吗?
我正在尝试创建一个使用文件播放视频的应用AVFoundation.视频显示在通过点击父表视图中的行访问的视图中.真正的应用程序将有每行的视频,但目前我只使用一个进行测试.
当在模拟器上运行时,应用程序是可以的,但是当在设备上运行时(在ios 5.1下),视频可以播放大约5次,然后以各种方式无法预测地崩溃.最常见的是,视频视图会加载,但视频本身不会播放,但有时我会EXC_BAD_ACCESS在一个coremedia.remote线程上获取,抱怨分配的对象没有自动释放池.我添加了一个@autoreleasepool包装启动AVPlayer的代码块,但这似乎没有帮助.
我想知道发生的事情是GCD是在主队列上创建多个线程来播放项目,但它们并没有终止.
因此,关键问题是-我怎么清理多余的GCD线程AVPlayer是,如果用户点击视频视图中的后退按钮尽可能我已经按照苹果公司在提供的示例代码上运行AVFoundation的文件在这里
我有添加了一些日志记录和(如上所述)一个@autoreleasepoolGCD块内的块 - 除了我没有更改代码.
该viewDidLoad方法如下:
-(void)viewDidLoad{
[super viewDidLoad];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"TestLapCar2Vid" withExtension:@"m4v"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
dispatch_async(dispatch_get_main_queue(),
^{
@autoreleasepool {
NSError *error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
if(status == AVKeyValueStatusLoaded){
avPlayerItem = [AVPlayerItem playerItemWithAsset:asset];
[avPlayerItem addObserver:self forKeyPath:@"status"
options:0 context:&ItemStatusContext];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification object:avPlayerItem]; …Run Code Online (Sandbox Code Playgroud) 我在Cocoa应用程序中使用AVPlayer,并且我实现了一个跳转到视频末尾的命令.
问题是,AVPlayer没有寻求我告诉它的地方.
例如,我有一个视频是4分14秒.当我寻求结束时,AVPlayer寻求4分12秒 - 两秒钟.如果我然后点击播放,播放器将播放两秒钟,然后到达结尾.
我的第一次尝试是这样的:
[self.player seekToTime:self.player.currentItem.duration];
Run Code Online (Sandbox Code Playgroud)
我把它换成了这个:
[self.player seekToTime:self.player.currentItem.duration
toleranceBefore:kCMTimePositiveInfinity
toleranceAfter:kCMTimeZero];
Run Code Online (Sandbox Code Playgroud)
两者都没有比另一个更好.
我也试过去寻求kCMTimePositiveInfinity.那时它只是忽略了我.
播放器是否已加载视频的那部分似乎并不重要.我甚至可以寻求不完全结束,玩到真正的结局,然后再次尝试寻求到最后,它将跳回到不完全结束.
缺口并不总是两秒钟.在我的一些视频中,它或多或少地完全正确地工作,如果不完全正确,则跳得非常接近真实的结束.在至少一个,它短至三秒钟.长度似乎不是一个因素; 所有这些都是大约相同的长度,除了一个,超过一个小时,并寻求短短两秒.
那么,为什么AVPlayer在我告诉它的地方跳了多达三秒钟,我怎么说服它跳到我要求的那一刻?
所以我知道AVPlayerItemDidPlayToEndTimeNotification当一部电影' 播放到它的结束时间 '时发送.
我的问题是玩家如何知道物品是否到达结束时间?我正在播放由第三方生成器生成的直播.它不断更新M3U8并创建新的TS文件,实时流媒体应该这样做.但是在某些时候我的玩家会收到一个AVPlayerItemDidPlayToEndTimeNotification并因此调用我的退出方法并退出.第三方流生成器仍然运行正常.我可以重新启动播放器并观看流.由于播放项目是直播,playerItem.duration不是一个可读的持续时间数字,这使我觉得结束时间更像是一个黑魔法......
真的很困惑玩家怎么认为它结束了.我的猜测可能是TS文件有问题,让玩家认为整场比赛结束了?但如果是这样,玩家是否应该改变其状态而不是默默地完成比赛?
PS我也尝试过不同的方法,例如从m3u8列表中删除一个ts,或者停止生成新的,以便玩家可以播放当前的m3u8并播放过去的最后一个ts,没有什么能让AVPlayerItemDidPlayToEndTimeNotification魔术发生......
我将通知注册如下:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.playerItem];
我的崩溃影响了大约10%的用户,但我无法重现它,并且不确切知道何时发生这种情况.
Crashlytics报告了大约一半的崩溃用户没有关注应用程序,即做背景音频或AirPlay.该应用程序播放HLS视频流,并在背景时切换到仅音频版本.
任何想法有什么问题,或者为什么我的单例播放器类会有多个AVPlayer实例?
谢谢!
Exception Type:
NSInvalidArgumentException
Reason:
An AVPlayerItem cannot be associated with more than one instance of AVPlayer
Fatal Exception
Latest Crash: 4/06/2013 at 8:48:46 UTC+0200
0 CoreFoundation __exceptionPreprocess + 162
1 libobjc.A.dylib objc_exception_throw + 30
2 AVFoundation -[AVPlayerItem _attachToPlayer:] + 188
3 AVFoundation -[AVPlayer _attachItem:andPerformOperation:withObject:] + 336
4 AVFoundation -[AVPlayer _insertItem:afterItem:] + 26
5 AVFoundation -[AVQueuePlayer insertItem:afterItem:] + 136
6 MediaPlayer __block_global_4 + 520
7
...
libdispatch.dylib _dispatch_call_block_and_release + 10
14
Run Code Online (Sandbox Code Playgroud) HLS(m3u8)文件引用mpeg-ts文件.在iOS'AVPlayer中播放时,如何确定当前正在播放的mpeg-ts URI?
我正在制作一个视频应用程序,一个接一个地播放大量视频.视频存储在一个AVPlayerItems 数组中.AVQueuePlayer初始化与那些AVPlayerItems和它自动地从该阵列播放视频.
问题是,当它改变播放下一个视频就被卡住了几分之一秒,或者它从一个到另一个过渡的时间创建了一个混蛋.我想改善与某种动画如淡入这一过渡,而更改视频淡出.
我的代码AVQueuePlayer:
AVQueuePlayer *mediaPlayer = [[AVQueuePlayer alloc] initWithItems:arrPlayerItems];
playerLayer=[AVPlayerLayer playerLayerWithPlayer:mediaPlayer];
playerLayer.frame=self.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.needsDisplayOnBoundsChange = NO;
[self.layer addSublayer:playerLayer];
self.layer.needsDisplayOnBoundsChange = YES;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(itemPlayEnded:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[mediaPlayer currentItem]];
Run Code Online (Sandbox Code Playgroud)
我试图创建在过渡的时间一个新层,通过降低其不透明度和增加新的图层的不透明度动画旧层(创建淡出效果所需的渐暗),但可根据需要它无法正常工作.
自定义转换的代码:
-(void)TransitionInVideos {
if (roundf(CMTimeGetSeconds(mediaPlayer.currentTime))==roundf(CMTimeGetSeconds(mediaPlayer.currentItem.duration))) {
[self.layer addSublayer:playerLayerTmp];
//Animation for the transition between videos
[self performSelector:@selector(FadeIn) withObject:nil afterDelay:0.3];
[self performSelector:@selector(FadeOut) withObject:nil afterDelay:0.3];
}
}
-(void)FadeIn {
CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
fadeAnim.duration …Run Code Online (Sandbox Code Playgroud) 在Mac应用程序中使用AVPlayer从文件夹中全屏播放随机视频,但是当我尝试播放.vob文件或.mpg文件时,我只会看到一个持续视频持续的黑屏.
AVFoundation不支持从这些容器播放吗?我认为既然他们可以使用QuickTime Player库存,他们也可以使用AVPlayer.
目标是使用Swift在设备上捕获全屏视频.在下面的代码中,视频捕获似乎全屏发生(录制相机预览时使用全屏),但视频的渲染以不同的分辨率发生.特别是对于5S,看起来捕获发生在320x568但渲染发生在320x480.
如何捕获和呈现全屏视频?
视频捕获代码:
private func initPBJVision() {
// Store PBJVision in var for convenience
let vision = PBJVision.sharedInstance()
// Configure PBJVision
vision.delegate = self
vision.cameraMode = PBJCameraMode.Video
vision.cameraOrientation = PBJCameraOrientation.Portrait
vision.focusMode = PBJFocusMode.ContinuousAutoFocus
vision.outputFormat = PBJOutputFormat.Preset
vision.cameraDevice = PBJCameraDevice.Back
// Let taps start/pause recording
let tapHandler = UITapGestureRecognizer(target: self, action: "doTap:")
view.addGestureRecognizer(tapHandler)
// Log status
print("Configured PBJVision")
}
private func startCameraPreview() {
// Store PBJVision in var for convenience
let vision = PBJVision.sharedInstance()
// Connect PBJVision …Run Code Online (Sandbox Code Playgroud) 我想在AVPlayerViewController中播放本地视频,但没有找到完成按钮的点击事件.
我的视频可以在AVPlayerViewController中播放但我没有找到下一个按钮,上一个按钮和完成按钮点击事件.