ios 视频播放器MPMoviePlayerController

这个东西和之前的音频播放差不多, 也是先需要导入系统框架MediaPlayer.framework 才能使用到MPMoviePlayerController 的文件中导入相应的头文件

初始化:这里就有些不一样了MPMoviePlayerController是可以通过远程url初始化的, 例如:

MPMoviePlayerController *moviePlayer = [ [ MPMoviePlayerController alloc]initWithContentURL:[NSURL urlWithString:@"URL"] ];

接下来是控制器样式设置:

moviePlayer.moviewControlMode = MPMovieControlModeHidden;  

  

可以使用下列样式:
MPMovieControlModeDefault            显示播放/暂停、音量和时间控制
MPMovieControlModeVolumeOnly         只显示音量控制
MPMovieControlModeHidden             没有控制器

通常情况下, 我们一般都是自己来定义视频播放器, 所以大多数还是选择最后没有控制器的那个.

屏幕宽高比例:

moviePlayer.scallingMode = MPMovieScallingModeNone;

MPMovieScallingModeNone            不做任何缩放
MPMovieScallingModeAspectFit       适应屏幕大小,保持宽高比
MPMovieScallingModeAspectFill      适应屏幕大小,保持宽高比,可裁剪
MPMovieScallingModeFill            充满屏幕,不保持宽高比

[ moviePlayer play ];  // 开始播放
[ moviePlayer stop ];  // 停止播放

注册一个通知 你的程序可以配置电影播放器在何时候发送通知,包括结束加载内容、技术播放、改变宽高比等。电影播放器会将事件发送到 Cocoa 的通知中心,你可以对其进行配置,指定将这些事件转发到你的应用程序的一个对象。要接收这些通知,需要使用 NSNotificationCenter 类,为电影播放器添加一个观察者(observer):

NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];  
[ notificationCenter addObserver:self selector:@selector(moviePlayerPreloadFinish:) name:MPMoviePlayerContentPreloadDidFinishNotification object:moviePlayer ];
// 通知会发到你指定的委托类和目标方法。通知参数让你可以知道是哪个事件触发了委托方法:
-(void)moviePlayerPreloadDidFinish:(NSNotification*)notification{  
    //添加你的处理代码  
}  

  

你会观察到以下通知:
MPMoviePlayerContentPreloadDidFinishNotification 
当电影播放器结束对内容的预加载后发出。因为内容可以在仅加载了一部分的情况下播放,所以这个通知可能在已经播放后才发出。
MPMoviePlayerScallingModeDidChangedNotification 
当用户改变了电影的缩放模式后发出。用户可以点触缩放图标,在全屏播放和窗口播放之间切换。
MPMoviePlayerPlaybackDidFinishNotification 
当电影播放完毕或者用户按下了Done按钮后发出。

这里有个小实例:自定义视频之用手势来控制视频进度和音量大小

 

#import <MediaPlayer/MediaPlayer.h>  
  
@interface KKBMoviePlayerController : MPMoviePlayerController<UIGestureRecognizerDelegate>  
  
@end  

  

#import "KKBMoviePlayerController.h"  
#import "AppDelegate.h"  
@interface KKBMoviePlayerController(){  
    BOOL _inFullScreen;  
    UIPanGestureRecognizer *_pan;  
      
    CGPoint _lastPoint;  
    BOOL _startChange;  
    BOOL _changeVolume;  
}  
  
@end  
  
@implementation KKBMoviePlayerController  
  
- (id)initWithContentURL:(NSURL *)url{  
    self =[super initWithContentURL:url];  
    if (self) {  
          
        self.view.backgroundColor = [UIColor clearColor];  
        self.initialPlaybackTime = -1;  
        self.endPlaybackTime = -1;  
        [self prepareToPlay];  
        [self play];  
          
        [[NSNotificationCenter defaultCenter] addObserver:self  
                                                 selector:@selector(enterFullScreen:)  
                                                     name:MPMoviePlayerWillEnterFullscreenNotification  
                                                   object:nil];  
          
        [[NSNotificationCenter defaultCenter] addObserver:self  
                                                 selector:@selector(leaveFullScreen:)  
                                                     name:MPMoviePlayerWillExitFullscreenNotification  
                                                   object:nil];  
    }  
    return self;  
}  
  
#pragma mark - full screen controller  
  
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  
    return YES;  
}  
  
- (void)handlePan:(UIPanGestureRecognizer*)rec{  
    if (_inFullScreen) {  
        if (rec.state == UIGestureRecognizerStateBegan) {  
            _lastPoint = [rec locationInView:self.view];  
        } else if (rec.state == UIGestureRecognizerStateChanged) {  
            CGPoint nowPoint = [rec locationInView:self.view];  
              
            if (_startChange == NO) {  
                if (fabs(nowPoint.y - _lastPoint.y) > fabs(nowPoint.x - _lastPoint.x)) {  
                    _changeVolume = NO;  
                } else {  
                    _changeVolume = YES;  
                }  
                _startChange = YES;  
            } else {  
                if (_changeVolume) {  
                    //change volume  
                    float volume = [[MPMusicPlayerController applicationMusicPlayer] volume];  
                    float newVolume = volume;  
                      
                    if (nowPoint.x == _lastPoint.x) {  
                          
                    } else {  
                        if (nowPoint.x < _lastPoint.x) {  
                            newVolume += 0.01;  
                        } else {  
                            newVolume -= 0.01;  
                        }  
                    }  
                      
                    if (newVolume < 0) {  
                        newVolume = 0;  
                    } else if (newVolume > 1.0) {  
                        newVolume = 1.0;  
                    }  
                      
                    [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];  
                } else {  
                    //change playback state  
                    if (self.playbackState != MPMoviePlaybackStateSeekingForward &&  
                        self.playbackState != MPMoviePlaybackStateSeekingBackward) {  
                        if (nowPoint.y == _lastPoint.y) {  
                              
                        } else {  
                            if (nowPoint.y < _lastPoint.y) {  
                                [self beginSeekingForward];  
                            } else {  
                                [self beginSeekingBackward];  
                            }  
                        }  
                        _lastPoint = nowPoint;  
                    }  
                }  
                  
            }  
              
        } else if (rec.state == UIGestureRecognizerStateCancelled ||  
                   rec.state == UIGestureRecognizerStateEnded ||  
                   rec.state == UIGestureRecognizerStateFailed){  
            _startChange = NO;  
            [self endSeeking];  
        }  
    }  
}  
  
- (void)enterFullScreen:(NSNotification*)notification{  
    _inFullScreen = YES;  
      
    _pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];  
    _pan.delegate = self;  
      
    [[[[UIApplication sharedApplication] windows] objectAtIndex:0] addGestureRecognizer:_pan];  
}  
  
- (void)leaveFullScreen:(NSNotification*)notification{  
    _inFullScreen = NO;  
    [[[[UIApplication sharedApplication] windows] objectAtIndex:0] removeGestureRecognizer:_pan];  
}  
  
@end  

  

原文: http://blog.csdn.net/u013561113/article/details/21457903

 

转载于:https://www.cnblogs.com/JJFly/p/4297724.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值