`

视频播放器分析

阅读更多

视频播放器分析

 

       当我们进入到视频网页,点击视频播放或直接点击本地视频,会调起视频播放器。而调起的视频播放器,我们一般分为系统播放器和QB视频播放器。


    系统播放器                                                            QB播放器

 

播放器的基本功能有播放/暂停、快进/后退、音量和亮度控制、视频列表进度条等。我们对播放器的操作是如何实现的呢?答案是播放器内核。

       你可以看到系统播放器和QB播放器的界面明显不同,那是因为QB播放器采取的是自定义播放器样式。下面就针对这两种形式的播放器进行介绍。

 

一、系统播放器

       系统播放器是使用 MediaPlayer.framework中的MPMoviePlayerController 类实现的。该类实例对象可以播放本地或在线视频,使用MPMediaPlayback协议中的属性和方法实现视频的播放/暂停、快进/后退、拖动进度条操作等。下面简单描述一下播放器的实现逻辑。

1.创建播放器

 引入 MediaPlayer.framework.然后在使用到MPMoviePlayerController 的文件中导入相应的头文件。 MPMoviePlayerController 类通过一个NSURL来初始化,这个URL可以使本地的,也可以是远程的。初始化需要通过 initWithContentURL 方法来实现:   

MPMoviePlayerController *moviePlayer = [ [ MPMoviePlayerController alloc]initWithContentURL: [NSURL urlWithString:@"http://"] ];//远程 

 

NSString* path =[ NSString stringWithFormat:@"%@/Documents/video.3gp",NSHomeDirectory()];//地路径  

MPMoviePlayerController *moviePlayer = [ [ MPMoviePlayerController alloc]initWithContentURL: [NSURL fileURLWithPath:path]];//本地的 

2.设置播放器样式属性

UI实现这里不做过多描述,有兴趣的同学可以去官网查看UIViewController类。

moviePlayer.moviewControlMode = MPMovieControlModeDefault;

 

可以使用下列样式: 



 
屏幕宽高比例

moviePlayer.scallingMode = MPMovieScallingModeAspectFit;



 
3.添加通知监控媒体播放控制器状态

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

NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];

[ notificationCenter addObserver:self selector:@selector(moviePlayerPreloadFinish:) name:MPMoviePlayerContentPreloadDidFinishNotification object:moviePlayer ];

通知会发到你指定的委托类和目标方法。通知参数让你可以知道是哪个事件触发了委托方法:

-(void)moviePlayerPreloadDidFinish:(NSNotification*)notification{ 

//添加你的处理代码}  

4.播放和停止视频

播放视频调用play 方法,播放器会自动将视图切换到电影播放器并开始播放:

[ moviePlayer play ]; 

当用户点击完成按钮,或者 stop 方法被调用都会停止:

[ moviePlayer stop ];

当电影停止播放后会自动切回播放前应用程序所在的视图。 

上述只是系统播放器的简单逻辑,想了解更多,可以去官网查看MPMoviePlayerController的常用属性和方法。

 

二、QB播放器

MPMoviePlayerController足够强大,几乎不用写几行代码就能完成一个播放器,但是正是由于它的高度封装使得要自定义这个播放器变得很复杂,甚至是不可能完成。如QB需要自定义播放器的样式,那么如果要使用MPMoviePlayerController就不合适了,而要对视频有自由的控制则AVFoundation框架是更好的选择。它更加接近于底层,所以灵活性也更强:



 
而要理解AVFoundation框架就得说到AVAssetAVAssetAVFoundation框架的主类, 是一个抽象类,理解了它的框架就理解了AVFoundation框架。

1.AVAsset

AVAsset是基于时间的视听数据(视频、音频)的抽象类。下图列出了其子类,当具体实现一个对象时,就是用到它的子类。



 

一个asset对象包含如下内容。每个AVAssetTrack分别对应asset要展示或处理的内容:音频、视频、文本、字幕。所以asset对象提供了多媒体的所有信息:字幕、时长、画面比例等。在简单的asset实例中,一个track对应音频,一个track对应视频。在复杂的asset实例中,则可能有多个音频与视频叠加的track

 

track有多个属性:类型(音频/视频)、音频/视频的特性、元数据、时间轴、格式描述数组。

 

 

2. AVPlayer

若要播放asset内容,则必须用到AVPlayer。用这个类的对象来控制asset(音频/视频)的播放,如:播放/暂停,定点播放等。使用AVPlayerItem管理asset状态,AVPlayerItemTrack管理track状态,使用AVPlayerLayer进行展示。这几个类的关系可以这么去形容。Asset可以被视为影盘、AVPlayer是放映机、AVPlayerLayer是荧幕。



 
3.播放

总的来说,asset主要有两种类型,一种是基于文件的(本地文件、媒体库),另一种是基于流媒体的(HTTP流媒体格式的在线文件)。

本地文件播放的步骤如下。

1.先通过AVPlayerLayerAVPlayer创建播放器对象包括它的UI

2. 使用 AVURLAsset创建asset对象后,创建AVPlayerItem对象并将它与AVPlayer对象联系起来。

3.当接收到AVPlayerItem的状态改变的通知时,就变为就绪播放状态了。

4.接下来的播放操作,通过SynUI来响应对应的事件。

 

在线视频的播放步骤如下。

1.利用URL来创建AVPlayerItem 对象,将实例与播放器联系起来,准备播放。

2.当准备播放时,会创建AVAsset  AVAssetTrack 对象。

3.创建监控。用来监控播放器和AVPlayerItem 对象的状态。当状态发生改变时,监控器会发送键值进行通知。此时必须通过主线程调用相关的函数来更新播放器的展示。

4.对视频进行播放操作,响应UI事件。关于视频的播放,可以查看这篇资料https://developer.apple.com/library/prerelease/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW8

 

下面简单的说一下自定义浏览器里面的某些功能的是如何实现的。

1.播放/暂停

AVPlayer对应着两个方法playpause来实现。但是关键问题是如何判断当前视频是否在播放,通常情况下可以通过判断播放器的播放速度来获得播放状态。如果rate0说明是停止状态,1是则是正常播放状态。

2.视频的切换

AVPlayer提供了- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item方法用于在不同的视频之间切换(AVFoundation内部还有一个AVQueuePlayer专门处理播放列表切换,有兴趣的朋友可以自行研究)。

3.定点播放

拖动视频时,通过手势监控,告知时间的变化。因为视频播放,播放内核会有定时器在时间发生变化的时候通知外层做进度更新。拖动完成时程序会告诉内核需要定位的时间点,实现进度条和画面同步。

 

针对下面这个bug进行分析。



 
播放进度原理

播放进度在退出播放器时会把当前的播放时间点保存到本地的数据库中,达到记录当前播放进度的目的。

 

产生原因:

因为qqv格式播放时切前后台时是会重新播放的,这时应该是读取上次播放的历史记录,然后跳到该历史播放时间点。但是原来的逻辑里面没有存这个历史记录,所以就从头开始播放了。

 

播放器原理学习后的思考:

1、该文只是简单的描述了一下播放器大概的框架,细枝末节还未弄清楚

2、此文中还存有一些描述不恰当的地方,还需要后期学习更正

3、我们在测试中发现的问题,牵扯到的是各个类中的属性或方法,每次开发的改动,相同的操作都有可能传递不同的值导致逻辑错误。

4、播放器的功能其实也就界面中看到的那些,但是这些按钮响应的事件有着多个不同的值,若要真正最大范围覆盖到播放器的所有功能,就需要了解到函数参数的意义,通过不同的操作达到传递不同的参数值。


 
 
 
 

  • 大小: 108.5 KB
  • 大小: 6.4 KB
  • 大小: 8.8 KB
  • 大小: 24.3 KB
  • 大小: 19.8 KB
  • 大小: 14 KB
  • 大小: 35.9 KB
  • 大小: 53.5 KB
  • 大小: 93.3 KB
分享到:
评论

相关推荐

    视频播放器需求分析说明书

    根据给定的文件信息,我们可以提炼出以下关于“视频播放器需求分析说明书”的详细知识点: ### 视频播放器需求分析 #### 引言 - **编写目的**:旨在为视频播放器软件提供全面的用户需求分析,确保软件功能、性能...

    android 视频播放器 项目和原码

    通过分析这个项目的源码,开发者不仅可以学习到Android视频播放器的基本实现,还能了解到如何处理播放过程中的各种问题,以及如何进行性能优化。对于希望深入理解Android多媒体开发的程序员来说,这是一个非常有价值...

    安卓的一个视频播放器源码

    通过分析和学习这个源码,开发者不仅可以了解Android视频播放的基本流程,还能掌握到如何构建高效、稳定且功能丰富的视频播放器。对于希望在Android多媒体开发领域深入的人来说,这是一份非常宝贵的学习资料。

    易语言在线视频播放器

    对于易语言爱好者来说,分析这款在线视频播放器的源码("易语言在线电视播放源码.e")是一次宝贵的学习机会。通过阅读和理解代码,可以深入理解易语言在网络编程和多媒体处理方面的应用,提高编程技能。 总的来说...

    Android应用源码之完整版android视频播放器.rar

    在Android平台上,开发一个完整的视频播放器涉及到许多关键知识点,这些知识点构成了Android应用源码的基础。这个"Android应用源码之完整版android视频播放器"的压缩包很可能包含了一个功能完善的视频播放应用的所有...

    播放器需求分析

    ### 播放器需求分析知识点详述 #### 引言 **编写目的:** - 明确软件需求,确保项目规划与进度合理安排,组织软件开发与测试工作有序进行。 - 文档作为项目经理、设计人员及开发人员的共同参考依据,确保团队对项目...

    视频播放器样式Flash焦点图.rar

    在IT领域,尤其是在网页设计和开发中,"视频播放器样式Flash焦点图"是一个常见的概念,它结合了视频播放器的交互性和Flash技术的动态效果,以创建吸引用户的焦点图展示。焦点图,也被称为幻灯片或轮播图,是一种在...

    C#视频播放器源码

    在本文中,我们将深入探讨基于C#开发的视频播放器源码,以及它与MP4格式的关联。C#是一种广泛用于构建桌面、移动和Web应用程序的编程语言,由微软公司开发,支持.NET框架。利用C#的强大功能,开发者可以创建高效、...

    java视频播放器源代码

    Java视频播放器源代码解析 java视频播放器源代码是一个基于Java语言开发的简单视频播放器,该播放器使用Java Media Framework(JMF)来处理音频和视频流。下面我们将深入分析该源代码,了解其实现原理和关键技术点...

    android 视频播放器源代码

    10. **源码学习:** 分析提供的源代码,可以深入理解Android视频播放器的实现细节,如如何初始化`MediaPlayer`,如何处理视频的暂停和恢复,以及如何在后台保持播放状态等。 通过以上知识点的学习和实践,开发者...

    安卓视频播放器源码

    通过分析和学习这个"安卓视频播放器源码",开发者可以深入理解Android多媒体处理的核心概念,提升自己的App开发技能。无论是初学者还是经验丰富的开发者,都能从中获益,提升自己的视频播放器实现,为用户提供更优质...

    Android Studio视频播放器 源码.rar

    在Android平台上开发应用程序时,构建一个视频播放器是常见的需求之一。Android Studio作为官方推荐...通过学习和分析这份源码,开发者能够提升自己在Android视频播放器开发方面的技能,为构建自己的应用打下坚实基础。

    android本地视频播放器所有源代码

    在Android平台上开发本地视频播放器是一项常见的任务,它涉及到多媒体处理、用户界面设计以及系统资源管理等多个技术领域。本项目"android本地视频播放器所有源代码"提供了一个完整的解决方案,包含播放记录管理、...

    H5海康WS在线视频播放器

    海康威视(Hikvision)是一家知名的安防设备制造商,其产品包括监控摄像头等,而"海康WS在线视频播放器"则可能是他们为实现监控视频在线预览和播放所开发的一个专门的H5组件。 此播放器可能基于Web Socket(Ws)...

    android视频播放器源码

    在Android平台上,开发一款视频播放器是...通过对"android视频播放器源码"的深入学习和分析,开发者不仅可以理解Android多媒体处理的底层机制,还能掌握如何构建高效、稳定的视频播放应用,为用户提供优质的视听体验。

    C# 程序 视频播放器

    【C#程序 视频播放器】:C#是一种由微软开发的面向对象的编程语言,广泛用于构建各种类型的应用程序,包括桌面应用、Web应用以及游戏等。在这个项目中,我们关注的是一个C#编写的视频播放器,它可能包含了处理视频流...

    简单视频播放器(vc源程序)

    开发者可以通过查看和分析这些源代码,学习如何使用C++和相关的多媒体库来实现一个视频播放器。这可能包括文件I/O操作、内存管理、多线程技术、图形界面设计以及错误处理等编程技术。 总结来说,这个"简单视频...

    WPF简易视频播放器VideoPlayer

    【WPF简易视频播放器VideoPlayer】是一款基于C#编程语言和Windows Presentation Foundation(WPF)框架开发的轻量级视频播放软件。WPF是微软推出的一种用于构建桌面应用程序的UI框架,它提供了丰富的图形渲染能力和...

    Android网络视频播放器

    【Android网络视频播放器】 在安卓(Android)平台上开发网络视频播放器是一项技术密集型的任务,涉及到多个关键知识点。此项目可能是一个集成了多种技术的综合应用,旨在为用户提供流畅、高质量的在线视频观看体验...

Global site tag (gtag.js) - Google Analytics