1.ffplay视频播放原理分析
2.OpenGL - 教程 -调试图形学
3.OpenGL现状
4.mac电脑系统苹果电脑是源码什么系统
ffplay视频播放原理分析
作者|赵家祝FFmpeg框架由命令行工具和函数库组成,ffplay是源码其中的一种命令行工具,提供了播放音视频文件的源码功能,不仅可以播放本地多媒体文件,源码还可以播放网络流媒体文件。源码本文从ffplay的源码网站分析工具源码整体播放流程出发,借鉴其设计思路,源码学习如何设计一款简易的源码播放器。
一、源码播放器工作流程在学习ffplay源码之前,源码为了方便理解,源码我们先宏观了解一下播放器在播放媒体文件时的源码工作流程。
解协议:媒体文件在网络上传输时,源码需要经过流媒体协议将媒体数据分段成若干个数据包,源码这样就可以满足用户一边下载一边观看的源码需求,而不需要等整个媒体文件都下载完成才能观看。常见的流媒体协议有RTMP、HTTP、HLS、MPEG-DASH、MSS、HDS等。由于流媒体协议中不仅仅包含媒体数据,还包含控制播放的信令数据。因此,解协议是移除协议中的信令数据,输出音视频封装格式数据。
解封装:封装格式也叫容器,就是将已经编码压缩好的视频流和音频流按照一定的格式放到一个文件中,常见的封装格式有MP4、FLV、MPEG2-TS、AVI、MKV、MOV等。解封装是将封装格式数据中的音频流压缩编码数据和视频流压缩编码数据分离,方便在解码阶段使用不同的解码器解码。
解码:压缩编码数据是在原始数据基础上采用不同的编码压缩得到的数据,而解码阶段就是编码的逆向操作。常见的视频压缩编码标准有H./H.、MPEG-2、AV1、V8/9等,音频压缩编码标准有AAC、MP3等。解压后得到的视频图像数据是YUV或RGB,音频采样数据是PCM。
音视频同步:解码后的视频数据和音频数据是独立的,在送给显卡和声卡播放前,需要将视频和音频同步,避免播放进度不一致。
二、main函数ffplay的使用非常简单,以ffplay-iinput.mp4-loop2为例,表示使用ffplay播放器循环播放input.mp4文件两遍。执行该命令时,对应的源码在fftools/ffplay.c中,程序入口函数是main函数。
注:本文ffplay源码基于ffmpeg4.4。
2.1环境初始化
初始化部分主要调用以下函数:
init_dynload:调用SetDllDirectory("")删除动态链接库(DLL)搜索路径中的当前工作目录,是Windows平台下的一种安全预防措施。
av_log_set_flag:设置log打印的标记为AV_LOG_SKIP_REPEATED,即跳过重复消息。
parse_loglevel:解析log的级别,会匹配命令中的-loglevel字段。如果命令中添加-report,会将播放日志输出成文件。
avdevice_register_all:注册特殊设备的封装库。
avformat_network_init:初始化网络资源,可以从网络中拉流。
parse_options:解析命令行参数,示例中的-iinput.mp4和-loop2就是通过这个函数解析的,支持的选项定义在options静态数组中。解析得到的文件名、文件格式分别保存在全局变量input_filename和file_iformat中。
2.2SDL初始化
SDL的全称是SimpleDirectMediaLayer,是一个跨平台的多媒体开发库,支持Linux、Windows、MacOS等多个平台,实际上是对DirectX、OpenGL、Xlib再封装,在不同操作系统上提供了相同的函数。ffplay的播放显示是通过SDL实现的。
main函数中主要调用了以下三个SDL函数:
SDL_Init:初始化SDL库,传入的参数flags,默认支持视频、音频和定时器,如果命令中配置了-an则禁用音频,配置了-vn则禁用视频。
SDL_CreateWindow:创建播放视频的11000010源码窗口,该函数可以指定窗口的位置、大小,默认是*大小。
SDL_CreateRenderer:为指定的窗口创建渲染器上下文,对应的结构体是SDL_Render。我们既可以使用渲染器创建纹理,也可以渲染视图。
2.3解析媒体流
stream_open函数是ffplay开始播放流程的起点,该函数传入两个参数,分别是文件名input_filename和文件格式file_iformat。下面是函数内部的处理流程:
(1)初始化VideoState:VideoState是ffplay中最大的结构体,所有的视频信息都定义在其中。初始化VideoState时,先定义VideoState结构体指针类型的局部变量is,分配堆内存。然后初始化结构体中的变量,例如视频流、音频流、字幕流的索引,并赋值函数入参filename和iformat。
(2)初始化FrameQueue:FrameQueue是解码后的Frame队列,Frame是解码后的数据,例如视频解码后是YUV或RGB数据,音频解码后是PCM数据。初始化FrameQueue时,会对VideoState中的pictq(视频帧队列)、subpq(字幕帧队列)、sampq(音频帧队列)依次调用frame_queue_init函数进行初始化。FrameQueue内部是通过数组实现了一个先进先出的环形缓冲区,windex是写指针,被解码线程使用;rindex是读指针,被播放线程使用。使用环形缓冲区的好处是,缓冲区内的元素被移除后,其它元素不需要移动位置,适用于事先知道缓冲区最大容量的场景。
(3)初始化PacketQueue:PacketQueue是解码前的Packet队列,用于保存解封装后的数据。初始化PacketQueue时,会对VideoState中的videoq(视频包队列)、audio(音频包队列)、subtitleq(字幕包队列)依次调用packet_queue_init函数进行初始化。不同于FrameQueue,PacketQueue采用链表的方式实现队列。由于解码前的包大小不可控,无法明确缓冲区的最大容量,如果使用环形缓冲区,容易触发缓冲区扩容,需要移动缓冲区内的数据。因此,使用链表实现队列更加合适。
(4)初始化Clock:Clock是时钟,在音视频同步阶段,有三种同步方法:视频同步到音频,音频同步到视频,以及音频和视频同步到外部时钟。初始化Clock时,会对VideoState中的vidclk(视频时钟)、audclk(音频时钟)、extclk(外部时钟)依次调用init_clock函数进行初始化。
(5)限制音量范围:先限制音量范围在0~之间,然后再根据SDL的音量范围作进一步限制。
(6)设置音视频同步方式:ffplay默认采用AV_SYNC_AUDIO_MASTER,即视频同步到音频。
(7)创建读线程:调用SDL_CreateThread创建读线程,同时设置了线程创建成功的回调read_thread函数以及接收参数is(stream_open函数最开始创建的VideoState指针类型的局部变量)。如果线程创建失败,则调用stream_close做销毁逻辑。
(8)返回值:将局部变量is作为函数返回值返回,用于处理下面的各种SDL事件。
2.4SDL事件处理
event_loop函数内部是一个for循环,使用SDL监听用户的键盘按键事件、鼠标点击事件、窗口事件、退出事件等。
三、read_thread函数read_thread函数的作用是从磁盘或者网络中获取流,包括音频流、视频流和字幕流,然后根据可用性创建对应流的解码线程。因此read_thread所在的线程实际上起到了解协议/解封装的作用。核心处理流程可以分为以下步骤:
3.1创建AVFormatContext
AVFormatContext是封装上下文,描述了媒体文件或媒体流的构成和基本信息。avformat_alloc_context函数用于分配内存创建AVFormatContext对象ic。
拿到AVFormatContext对象后,在调用avformat_open_input函数打开文件前,需要设置中断回调函数,用于检查是否应该中断IO操作。
?ic->interrupt_callback.callback=decode_interrupt_cb;ic->interrupt_callback.opaque=is;decode_interrupt_cb内部返回了一个VideoState的abort_request变量,该变量在调用stream_close函数关闭流时会被置为1。
3.2打开输入文件
在准备好前面的vuemybatis源码一些赋值操作后,就可以开始根据filename打开文件了。avformat_open_input函数用于打开一个文件,并对文件进行解析。如果文件是一个网络链接,则发起网络请求,在网络数据返回后解析音频流、视频流相关的数据。
3.3搜索流信息
搜索流信息使用avformat_find_stream_info函数,该从媒体文件中读取若干个包,然后从其中搜索流相关的信息,最后将搜索到的流信息放到ic->streams指针数组中,数组的大小为ic->nb_streams。
由于在实际播放过程中,用户可以指定是否禁用音频流、视频流、字幕流。因此在解码要处理的流之前,会判断对应的流是否处于不可用状态,如果是可用状态则调用av_find_best_stream函数查找对应流的索引,并保存在st_index数组中。
3.4设置窗口大小
如果找到了视频流的索引,则需要渲染视频画面。由于窗体的大小一般使用默认值*,这个值和视频帧真正的大小可能是不相等的。为了正确显示承载视频画面的窗体,需要计算视频帧的宽高比。调用av_guess_sample_aspect_ration函数猜测帧样本的宽高比,调用set_default_window_size函数重新设置显示窗口的大小和宽高比。
3.5创建解码线程
根据st_index判断音频流、视频流、字幕流的索引是否找到,如果找到了就依次调用stream_component_open创建对应流的解码线程。
3.6解封装处理
接下来是一个for(;;)循环:
(1)响应中断停止、暂停/继续、Seek操作;
(2)判断PacketQueue队列是否满了,如果满了就休眠ms,继续循环;
(3)调用av_read_frame从码流中读取若干个音频帧或一个视频帧;
(4)从输入文件中读取一个AVPacket,判断当前AVPacket是否在播放时间范围内,如果是则调用packet_queue_put函数,根据类型将其放在音频/视频/字幕的PacketQueue中。
四、stream_component_open函数3.5小节讲到,stream_component_open函数负责创建不同流的解码线程。那么它是如何创建解码线程的呢?
4.1创建AVCodecContext
AVCodecContext是编解码器上下文,保存音视频编解码相关的信息。使用avcodec_alloc_context3函数分配空间,使用avcodec_free_context函数释放空间。
4.2查找解码器
根据解码器的id,调用avcodec_find_decoder函数,查找对应的解码器。与之类似的一个函数是avcodec_find_encoder,用于查找FFmpeg的编码器。两个函数返回的结构体都是AVCodec。
如果指定了解码器名称,则需要调用avcodec_find_decoder_by_name函数查找解码器。
不管是哪种方式查找解码器,如果没有找到解码器,都会抛异常退出流程。
4.3解码器初始化
找到解码器后,需要打开解码器,并对解码器初始化,对应的函数是avcodec_open2,该函数也支持编码器的初始化。
4.4创建解码线程
判断解码类型,创建不同的解码线程。
switch(avctx->codec_type){ caseAVMEDIA_TYPE_AUDIO://音频...if((ret=decoder_init(&is->auddec,avctx,&is->audioq,is->continue_read_thread))<0)gotofail;...if((ret=decoder_start(&is->auddec,audio_thread,"audio_decoder",is))<0)gotoout;...caseAVMEDIA_TYPE_VIDEO://视频...if((ret=decoder_init(&is->viddec,avctx,&is->videoq,is->continue_read_thread))<0)gotofail;if((ret=decoder_start(&is->viddec,video_thread,"video_decoder",is))<0)gotoout;...caseAVMEDIA_TYPE_SUBTITLE://字幕...if((ret=decoder_init(&is->subdec,avctx,&is->subtitleq,is->continue_read_thread))<0)gotofail;if((ret=decoder_start(&is->subdec,subtitle_thread,"subtitle_decoder",is))<0)gotoout;...}线程创建在decoder_start函数中,依然使用SDL创建线程的方式,调用SDL_CreateThread函数。
五、video_thread函数视频解码线程从视频的PacketQueue中不断读取AVPacket,解码完成后将AVFrame放入视频FrameQueue。音频的解码实现和视频类似,这里仅介绍视频的解码过程。
5.1创建AVFrame
AVFrame描述解码后的原始音频数据或视频数据,通过av_frame_alloc函数分配内存,通过av_frame_free函数释放内存。
5.2视频解码
开启for(;;)循环,不断调用get_video_frame函数解码一个视频帧。该函数主要调用了decoder_decode_frame函数解码,decoder_decode_frame函数对音频、视频、字幕都进行了处理,主要依靠FFmpeg的avcodec_receive_frame函数获取解码器解码输出的数据。
拿到解码后的视频帧后,会根据音视频同步的方式和命令行的-framedrop选项,判断是否需要丢弃失去同步的视频帧。
命令行带-framedrop选项,无论哪种音视频同步机制,都会丢弃失去同步的视频帧。
命令行带-noframedrop选项,无论哪种音视频同步机制,iotdb源码都不会丢弃失去同步的视频帧。
命令行不带-framedrop或-noframedrop选项,若音视频同步机制为同步到视频,则不丢弃失去同步的视频帧,否则会丢弃失去同步的视频帧。
5.3放入FrameQueue
调用queue_picture函数,将AVFrame放入FrameQueue。该函数内部调用了frame_queue_push函数,采用了环形缓冲区的处理方式,对写指针windex累加。
staticvoidframe_queue_push(FrameQueue*f){ if(++f->windex==f->max_size)f->windex=0;SDL_LockMutex(f->mutex);f->size++;SDL_CondSignal(f->cond);SDL_UnlockMutex(f->mutex);}六、音视频同步ffplay默认采用将视频同步到音频的方式,分以下三种情况:
如果视频和音频进度一致,不需要同步;
如果视频落后音频,则丢弃当前帧直接播放下一帧,人眼感觉跳帧了;
如果视频超前音频,则重复显示上一帧,等待音频,人眼感觉视频画面停止了,但是有声音在播放;
ffplay视频同步到音频的逻辑在视频播放函数video_refresh中实现。该函数的调用链是:main()->event_loop()->refresh_loop_wait_event()->video_refresh。
6.1判断播放完成
调用frame_queue_nb_remaing函数计算剩余没有显示的帧数是否等于0,如果是,则不需要走剩下的步骤。计算过程比较简单,用FrameQueue的size-rindex_shown,size是FrameQueue的大小,rindex_shown表示rindex指向的节点是否已经显示,如果已经显示则为1,否则为0。
6.2播放序列匹配
****分别调用frame_queue_peek_last和frame_queue_peek函数从FrameQueue中获取上一帧和当前帧,上一帧是上次已经显示的帧,当前帧是当前待显示的帧。
(1)比较当前帧和当前PacketQueue的播放序列serial是否相等:
如果不等,重试视频播放的逻辑;
如果相等,则进入(2)流程判断;
注:serial是用来区分是不是连续的数据,如果发生了seek,会开始一个新的播放序列,
(2)比较上一帧和当前帧的播放序列serial是否相等:
如果不相等,则将frame_timer更新为当前时间;
如果相等,不处理并进入下一流程
6.3判断是否重复上一帧
(1)将上一帧lastvp和当前帧vp传入vp_duration函数,通过vp->pts-lastvp->pts计算上一帧的播放时长。
注:pts全称是PresentationTimeStamp,显示时间戳,表示解码后得到的帧的显示时间。
(2)在compute_target_delay函数中,调用get_clock函数获取视频时钟,调用get_master_clock函数获取同步时钟,计算两个时钟的差值,根据差值计算需要delay的时间。
(3)如果当前帧播放时刻(is->frame_timer+delay)大于当前时刻(time),表示当前帧的播放时间还没有到,相当于当前视频超前音频了,则需要将上一帧再播放一遍。
last_duration=vp_duration(is,lastvp,vp);delay=compute_target_delay(last_duration,is);time=av_gettime_relative()/.0;if(time<is->frame_timer+delay){ *remaining_time=FFMIN(is->frame_timer+delay-time,*remaining_time);gotodisplay;}6.4判断是否丢弃未播放的帧
如果当前队列中的帧数大于1,则需要考虑丢帧,只有一帧的时候不考虑丢帧。
(1)调用frame_queue_peek_next函数获取下一帧(下一个待显示的帧),根据当前帧和下一帧计算当前帧的播放时长,计算过程和6.3相同。
(2)满足以下条件时,开始丢帧:
当前播放模式不是步进模式;
丢帧策略生效:framedrop>0,或者当前音视频同步策略不是音频到视频。
当前帧vp还没有来得及播放,但是下一帧的播放时刻(is->frame_timer+duration)已经小于当前系统时刻(time)了。
(3)丢帧时,将is->frame_drops_late++,并调用frame_queue_next函数将上一帧删除,更新FrameQueue的读指针rindex和size。
if(frame_queue_nb_remaining(&is->pictq)>1){ Frame*nextvp=frame_queue_peek_next(&is->pictq);duration=vp_duration(is,vp,nextvp);if(!is->step&&(framedrop>0||(framedrop&&get_master_sync_type(is)!=AV_SYNC_VIDEO_MASTER))&&time>is->frame_timer+duration){ is->frame_drops_late++;frame_queue_next(&is->pictq);gotoretry;}}七、渲染ffplay最终的图像渲染是由SDL完成的,在video_display中调用了SDL_RenderPresent(render)函数,其中render参数是最开始在main函数中创建的。在渲染之前,需要将解码得到的视频帧数据转换为SDL支持的图像格式。转换过程在upload_texture函数中实现,细节不在此处分析。
音频类似,如果解码得到的音频不能被SDL支持,需要对音频进行重采样,将音频帧格式转换为SDL支持的格式。
八、小结本文从整体播放流程出发,介绍了ffplay播放器播放媒体文件的主要流程,不深陷于代码细节。同时,对FFmpeg的一些常用函数有了一些了解,对我们自己手写一个简单的播放器有很大的帮助。
----------END----------OpenGL - 教程 -调试图形学
图形编程的确能带来乐趣,但错误的渲染或完全未渲染都会让人沮丧。在与像素打交道时,源码容器找到问题源头往往困难重重。与CPU调试不同,OpenGL调试没有控制台输出,不能在GLSL代码中设置断点,也无法检查GPU运行状态。下面介绍一些调试OpenGL程序的技巧,这些技巧将大大帮助你解决问题。
首先,了解OpenGL中的用户错误标记。当你使用OpenGL不当(例如在绑定之前配置缓冲)时,它会检测到错误,并在幕后生成用户错误标记。通过调用glGetError()函数,可以查询这些错误标记并返回错误值。例如,glBindTexture()函数的文档中列出了所有可能生成的用户错误代码。
值得注意的是,glGetError()在每次调用后会清除所有错误标记,因此在循环中调用该函数以检查每帧可能的错误更为合适。在分布式系统(如X)中,glGetError()只会清除一个错误代码标记,这意味着在多次调用之间可能有多个错误发生。
利用glGetError()定位错误来源非常有效,通过在代码中各处调用它,可以快速确定OpenGL错误的源头。此外,可以编写辅助函数将错误代码与错误发生的位置(使用预处理器指令__FILE__和__LINE__)结合打印出来,便于追踪错误。
对于OpenGL 4.3及以上版本,可以使用调试输出拓展,它直接将更详细的信息发送给用户,有助于使用调试器捕捉错误源头。在GLFW中请求调试输出非常简单,只需要在创建窗口之前设置提醒。调试输出上下文启用后,每次不正确的OpenGL指令都会提供大量有用的错误信息。
利用调试输出,可以很容易地找到错误发生的准确行号或调用。通过在特定错误类型或函数顶部设置断点,调试器在抛出错误时捕捉信息,帮助快速定位问题。此外,可以使用glDebugMessageInsert()函数自定义错误输出,方便与使用调试输出的程序或OpenGL代码协同开发。
对于GLSL着色器,虽然无法直接使用如glGetError()的函数,但可以利用输出变量到帧缓冲的颜色通道来快速检查着色器代码的正确性。通过观察视觉结果,可以快速识别变量是否显示了正确的值。这种方法适用于检查法向量、纹理等变量是否正确传递。
确保你的着色器代码符合GLSL规范,可以使用OpenGL GLSL参考编译器进行检查。下载可执行版本或完整源码,将着色器文件作为参数传递,编译器会报告任何规范不符合的情况。
显示帧缓冲的内容是调试的一个好方法,特别是当帧缓冲在幕后运行时。通过简单的着色器编写一个助手函数,可以在屏幕右上角快速显示任何纹理,以便检查帧缓冲输出。这种方法能让你对帧缓冲内容保持持续反馈。
在遇到上述方法无法解决问题时,可以使用第三方调试软件。这些工具通常可以注入OpenGL驱动,拦截各种OpenGL调用,提供大量有用的数据,如性能测试、缓冲内存检查、纹理和帧缓冲附件显示等。适合大规模产品代码开发。
推荐的调试工具包括gDebugger、RenderDoc、CodeXL、NVIDIA Nsight等,它们在不同方面提供强大支持。每款工具都有其优点和适用场景,选择最适合你需求的工具。
OpenGL现状
OpenGL作为唯一有潜力取代微软在3D图形技术领域主导地位的API,依然保持着一定的生命力。尽管Silicon Graphics不再以让微软感到不悦的方式推广OpenGL,但游戏开发者群体,特别是重要的开发人员,依然在使用OpenGL,促使硬件开发商加强了对它的支持。Direct3D在高端图形设备和专业应用支持方面还存在不足,使得OpenGL在这些领域占据了统治地位。开放源码社区,特别是Mesa项目,致力于为各类计算机提供OpenGL支持,无论它们是否使用微软的操作系统。 中国当前三维游戏开发技术正处在追赶国际水平的关键阶段。在创意、策划、研究开发与实现,以及游戏运营与维护等方面,有大量的知识需要学习和探索。随着Linux操作系统的推广,基于Linux的各种应用软件不断壮大,基于跨平台图形库的跨平台三维游戏开发越来越受到重视。OpenGL作为独立的平台无关的三维图形开发库,在多种语言下进行主框架开发并结合OpenGL函数,可以开发出三维游戏。虽然框架开发的平台相关性导致游戏无法跨平台编译运行,但glut+OpenGL的方式被广泛采用。 然而,glut在支持复杂框架和各种媒体方面表现不佳。在Linux环境下,FLTK等框架平台技术可实现包括按钮在内的较复杂功能,但需要专门的Linux开发环境,这使得许多Window环境下的KDE爱好者难以接受。相比之下,SDL(Simple DirectMedia Layer)作为免费的跨平台多媒体应用编程接口,被广泛用于开发二维游戏。SDL以其优秀的消息框架支持、文件支持和声音支持等特点,成为与微软DirectX相匹敌的成熟技术之一。 截至年8月7日,Khronos Group发布了最新的OpenGL 4.3规范。这一规范的发布标志着OpenGL技术的持续发展,为游戏开发者和三维图形技术从业者提供了更多的可能性和创新空间。扩展资料
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。mac电脑系统苹果电脑是什么系统
‘壹’ MAC是什么操作系统MAC苹果电脑默认安装的是Mac OS操作系统。
‘贰’ macbook的操作系统是什么
你好:
macbook只是苹果的一个电脑而已,也就是一堆硬件。
操作系统苹果出厂自带MAC OS,也就是苹果操作系统,部分苹果电脑出厂也是自带windows系统的。
如果你有需要,可以自己装windows系统或者MAC OS系统。
如果你的技术够高,也可以装Linux系统。
‘叁’ 苹果电脑用的是什么系统
苹果电脑用的是MacOS系统。
macOS(年及之前称MacOSX,年至年称OSX)是苹果公司推出的基于图形用户界面操作系统,为麦金塔(Macintosh,简称Mac)系列电脑的主操作系统。
macOS包含两个主要的部分:核心名为Darwin,是以BSD源代码和Mach微核心为基础,由苹果公司和独立开发者社区合作开发;及一个由苹果公司开发,名为Aqua的专利的图形用户界面。
(3)mac电脑系统:
特点
1、全比特技术,可以通过第三方的ModeSelector进行比特和比特切换。
2、GrandCentralDispatch:帮助程序编译人员使用多核心编译,增强软件多核心支持。
3、OpenCL:是一种让图像处理器发挥极致来加速应用程序性能的新技术。
4、辅助功能:通过万能辅助功能包含的VoiceOver2可以读出任何Mac上的文字。含有种以上盲文现实,支持蓝牙模式。
5、它的Quartz影像模式使用PDF(可携文件格式,PortableDocumentFormat)的子集合当作基础。
‘肆’ 操作系统mac是什么
MAC地址
MAC地址
MAC(Media Access Control, 介质访问控制)MAC地址是烧录在Network Interface Card(网卡,NIC)里的.MAC地址,也叫硬件地址,是由比特长(6字节),进制的数字组成.0-位是由厂家自己分配.-位,叫做组织唯一标志符(organizationally unique ,是识别LAN(局域网)节点的标识。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。
是学校记录的你的网卡地址 和 你现在的网卡地址不符
‘伍’ 什么是MAC操作系统
Mac OS X 是苹果麦金塔电脑之操作系统软件的 Mac OS 最新版本。Mac OS X 于 年 首次在商场上推出。它包含两个主要的部份:Darwin,是以 BSD 原始码和 Mach 微核心 为基础,类似 Unix 的开放原始码环境,由苹果电脑采用和与独立开发者协同作进一步的开发;及一个由苹果电脑开发,命名为 Aqua 之有版权的 GUI。
Mac OS X Server 亦同时于年发售. 架构上来说与工作站(客户端)版本相同,只有在包含的工作群组管理和管理软件工具上有所差异,提供对于关键网络服务的简化存取,像是邮件传输服务器, samba 软件,LDAP 目录服务器,以及名称服务器(DNS)。同时它也有不同的授权型态。
命名
X 这个字母是一个罗马数字且正式的发音为 "十"(ten),接续了先前的麦金塔操作系统像是 Mac OS 8 和 Mac OS 9 的编号。某些人把它读作 X 字母且发音为 "ex"。对于这个直接解读的原因是对于 Unix-like 操作系统的传统命名会以字母 "x" 作为结尾 (例如 AIX, IRIX, Linux, Minix, Ultrix, Xenix)。另外一个原因是苹果电脑的倾向提及特别的版本是以(例如) "Mac OS X 版本 .4" 印刷出来。
Mac OS X 版本以大型猫科动物命名。比他的推出更重要的,在苹果电脑内部 .0 版本的代号是猎豹(Cheetah),以及 .1 版本代号为美洲狮(Puma)。在苹果的产品市场 .2 版本命名为 美洲虎(Jaguar),以及 .3 相似地命名为 黑豹(Panther)。.4 版已经被公开命名为 老虎(Tiger)。花豹(Leopard) 当作下一个推出的操作系统。苹果电脑也已经注册山猫(Lynx)和美洲狮(Puma在美洲的惯用词,Cougar)当作未来使用的商标。
由于苹果使用 "Tiger" 这个名称,面对到名称为 TigerDirect 电脑零售商的法律诉讼。然而,在 年5月日,佛罗里达州联邦法庭裁决苹果电脑使用 "Tiger" 的名称并没有侵害到 TigerDirect 的商标。
苹果电脑的网站和文章中提及特殊的 Mac OS X 版本会以四种不同的方式呈现:
* Mac OS X v.4,版本号码
* Mac OS X Tiger,版本的代号名称
* Mac OS X v.4 "Tiger",版本号码和名称,苹果有时会省略引号。
* "Tiger",简单地版本名称
历史
主要文章:Mac OS X 历史
尽管简单地说它是 Mac OS "版本" 的分支,但它与早期发行的 Mac OS 大部份是历史上大部分独立的。它以 Mach 核心为基础和 UNIX 的 BSD 实作,整合到由 Steve Jobs 于 年被迫离开离开苹果后的 NeXT 公司所发展 面向对象操作系统 之 NeXTSTEP 中。同时,苹果电脑企图创造一个自己拥有的(参考 en:Taligent 和 en:Copland) "下个世代" 操作系统,但只有小部份成功。最后 NeXT 的操作系统—在那时候称为 OPENSTEP—被选为苹果下个操作系统的基础形式,然后苹果电脑完全地买下了 NeXT。Jobs 也就重新被聘雇,后来回到公司的领导阶层,带领大家把程序设计师亲善的 OPENSTEP,转换到苹果主要家庭使用者市场和创新的专家都很欢迎的一个系统上,就是大家都知道的 Rhapsody。在某些威胁对于 Mac OS 独立开发者忠心的失策,以及对于从 Mac OS 9 到新系统减轻转变的策略改变后,Rhapsody 演化为 Mac OS X。
Mac OS X 是与先前麦金塔操作系统彻底地分离开来,它的底层程序码完全地与先前版本不同。尽管最重要的架构改变是在表面之下,但是 Aqua GUI 是最突出和引人注目的特色。柔软边缘的使用,半透明颜色和细条纹(与第一台 iMac 的硬件相似)把更多的颜色和材质带入到桌面上的视窗和控件,比 OS9 所提供的 "白金" 外观更多,引发了使用者间大量的争论。很多旧的麦金塔使用者把这个接口描述得像是玩具一般,和缺乏专业的优美,而其他的人则为苹果革命的新 GUI 状新为所欢呼。这种外观非常立即地可以辨认出来,即使在第一个 Mac OS X 版本推出之前,第三方的开发者开始针对可以换外表的程序像是 Winamp 制作类似 Aqua 接口的外表。苹果电脑以法律行动,威胁那些声称是是由他们有版权的设计下,所制造或散布且提供这种接口软件的人。
纯粹由系统销售的数字来看,这种 GUI 和核心的组合最近到现在变成最畅销的类 Unix 环境。
兼容性
尽管苹果官方声称,Mac OS X只能在使用G3或更高阶的微处理器的电脑上运行。但实际上,透过修改,Mac OS X 亦能成功安装并运行在较早期的Power PC e上;甚至有人透过PearPC模拟器Linux版,在更早期的Centris (MHz) 上安装Mac OS X .3,只是以此方式安装的Mac OS X,没有多大的实用价值可言。(仅系统自我检测便得花上数天时间)
Mac OS X 透过提供一种称为 Classic 的模拟环境,保留了与较旧的 Mac OS 应用程序的兼容像,允许使用者在 Mac OS X 中把 Mac OS 9 当作一个程序行程来执行,使大部分旧的应用程序就像在旧的操作系统下执行一样。另外,给 Mac OS 9 和 Mac OS X 的 Carbon API 可以创造出允许在两种系统执行的程序码。OpenStep 的 API 也依然可以使用,但是苹果现在把它称为 Cocoa 技术。(这个遗留下来的传统可以在 Cocoa API 中看到,大部分的类别名称都是以 NeXTSTEP 的缩写 "NS" 开头。) 给开发者的第四个选项是可以在 Mac OS X 当作 "第一等公民" 一样的 Java 平台上写应用程序 — 事实上这就是说 Java 应用程序尽可能的与操作系统合适地搭配而仍然能够"跨平台(cross-platform)",以及他的 GUI,是以 Swing 撰写的,看起来几乎完全地与天生的 Cocoa 接口类似。
只要他们能够在这个平台上被编译,Mac OS X 可以执行很多 BSD 或 Linux 软件套件。编译过的程序码通常是以 Mac OS X 封装的方式来散布,但有些可能需要命令列的组态设定或是编译。像是 Fink 和 DarwinPorts 这样的专案,提供很多标准套件之预先编译或是预先格式好的封装。在 .3 版开始,Mac OS X 已经包含 Apple X,这是给 Unix 应用程序的 X 图形接口的公司版本,当作是在安装阶段的选择性元件。苹果是以 XFree 4.3 和 XR6.6 为基础实作的,搭配一个模仿 Mac OS X 外观的视窗管理员,与 Mac OS X 有更密切的整合,延展扩充到使用天生的 Quartz 显像系统和加速 OpenGL。早期的 Mac OS X 版本可使用 XDarwin 来执行 X 应用程序。
对于早期的 Mac OS X 版本,有支援的标准硬件平台是以 PowerPC G3、G4、G5 处理器的麦金塔电脑产品线(膝上型、装上型、或是服务器)。后期的 Mac OS X 版本不再支援某些老旧的硬件、举例来说,Panther 不支援 "米**" G3,以及 Tiger 不支援苹果在推出 FireWire 之前的系统。然而,免费的工具像是 XPostFacto 可以使得苹果官方宣称不支援的某些旧系统可以安装 Mac OS X,包含某些 G3 之前的系统。操作系统针对所有支援的硬件提供相同的功能,除了基本硬件的限制之外(例如,CD-ROM 不能烧录 CD)以及在更多先进配备上尽量增快效能(例如图形加速)。
于年6月6日,Steve Jobs 在苹果每年的全球开发者大会中发表演说,表示接下来的两年间苹果将会从 PowerPC 转换到 Intel 的微处理器[1],而且在这个转变的期间,Mac OS X 都会支援两种平台。对于 PowerPC 平台的支援会一直持续到 .5 版,但是同时支援两种平台多久的时间并不清楚(Mac OS 对于 Motorola k 架构的支援一直持续到 PowerPC 系统推出后的约四年)。新版的 Xcode 支援建造 通用二元程序码(Universal Binaries),可以在两种架构执行。PowerPC 程序码在 Intel 为基础的 Mac 会使用称为 Rosetta 的模拟器来提供支援。Jobs 也证实先前的谣言,就是苹果之前每一版的 Mac OS X 开发周期都有 Intel 微处理器的版本。像是跨平台的能力已经早就存在 OS X 的血统中 - 就是 OS X 的前身,OPENSTEP,已经被移植到很多个架构下,包含 Intel 的 x,以及 OS X 的核心操作系统 Apple Darwin 也移植到 x,早在 OS X 第一次推出就可以免费下载。然而,苹果声明 x 平台的 OS X 将不会支援 Classic 环境。
显着特点
* 它的 Quartz 影像模式使用 PDF(可携文件格式,Portable Document Format)的子集合当作基础。
* 全彩,可连续缩放的小图示(最大到 × 像素)
* 在视窗周围的阴影和分离的文字符素来提供深度的感觉。
* Global spell checking and other powerful tools thanks to NeXT-style application services.
* 专用界面工具集、文字、图形和视窗元件的反锯齿效果
* New interface elements including sheets (document modal dialogs attached to specific windows) and drawers.
* Interweaving windows of different applications (not necessarily adjacent in the visible stacking order).
* ColorSync color matching built into the core drawing engine (for print and multimedia professionals).
* OpenGL(在 .2 版中纳入) 合成视窗到萤幕上,容许硬件加速绘图。这种技术称为 Quartz Extreme。
* Exposé(在 .3 版中纳入)可以快速地排列视窗或是显现桌面。
* 在整个操作系统中普遍使用 Unicode。
* Straightforward architecture for localization of applications and other code, fully separating language dependencies from the core code of a program.
* FileVault(于 .3 版中纳入)可以使用 AES(Advanced Encryption Standard) 位元金钥来加密使用者的家目录。
* Dashboard(在 .4 版中纳入)支援小的应用程序称为 Widget,可以透过一个按键就叫出来和隐藏。
* Spotlight 搜寻技术(在 .4 版中纳入)允许以项目的特性或内容来快速的即时搜寻资料档案、邮件讯息、照片、和其他资讯。
* Automator(.4版中加入)是一种设计来为不同的工作任务建立一种自动化的工作流程之应用程序。
批评
与 Microsoft Windows 相比,有某些针对 Mac OS X 缺乏 升级价格 的评论;前一版的使用者必须付全额的价格购买新版。视 Mac OS X 零售包装是否被认为 "升级" 或不是而定,而有些语意上的争议。一方面,它只能在 Mac 上使用,所有的 Mac 都会搭配某些 Mac OS 的版本一起出售,所以它是有所争议的升级版本。另一方面,在 9.0 或 .3 升级到 .4 的升级版间没有价格的差异,假设消费者买了两种版本之一的完全授权,也就是至少对于其间的升级并没有得到任何的好处。此外,消费者在新版的的 Mac OS X 公布后到它开始预先安装到新机器来出货期间,购买了麦金塔电脑,通常可以以更少的金额(.~.美金)来得到升级版。同时,Windows 的 升级价格 实质上是视购买数量协议而有所变化,如家庭版 vs. 专业版等等,导致各版本间直接的价格对照相当困难。在某些情况下,Windows 的升级价格超过 Mac OS X 的价格,因此这种评论并不切实际。
The Open Group 也批评苹果对于 "Unix" 字眼在 Mac OS X 广告宣传使用,而苹果并没有让操作系统获得正式的认证,且他使用这个字眼可能构成商标上的违法行为。苹果宣称他们使用这个字眼当作 概括性商标,且获得认证所需的费用将会使得操作系统价格上变得更贵,但是 The Open Group 声明对于一家公司的认证费用上限是 0, 美金。即使 Mac OS X 是以 Unix 为基础,且以 BSD Unix 兼容性层面为特性,但是它并不兼容于 Single Unix Specification。对于苹果不去获得 "官方" Unix 品牌的原因可能是验证并不是苹果近期或中期的目标。
苹果在内部使用 "建造编号" 来区别每一个 Mac OS X 的开发版本。每一周可能会有好几个开发版本。在苹果的指导方针下,产品的第一个开发版本是由建造1A1开始。小改版是以 1A2、1A3、1A4 等等来编号。第一个主要的开发改版变成 1B1(并且小改版会变成 1B2、1B3 等等),而下一个主要的改版会变成 1C1,以此类推。在最后一个 1_ 系列的下一个主要改版会变成 2A,接着是 2B。从一个字母到下一个的转变发生在次要的推出编号。举例来说,Panther (.3) 的第一个建造编号是 7A1。第一个公开发行的编号是 7B;而最后一个 .3.9 是 7W。但是下一个 OS X 的版本是 .4,建造编号是 8A1。当一个建造被选为当作下一个公开释出的 Mac OS X,则它会给定一个公开的版本编号。编号 4K 就是被选为 Mac OS X 版本 .0,编号 5G 变成 .1,编号 6C 变成 .2,编号 7B 变成 .3,以及编号 8A 变成 .4。
现在的 Mac OS X 版本是 .4.5,建造编号 8H (于年2月日推出)。
Mac OS X v.0 猎豹(Cheetah)
在 年3月日,苹果推出了Mac OS X .0 (内部代号为猎豹)。其早期版本相当慢,功能也不齐全,仅有少量来自独立开发商的应用软件。很多评论员认为它并不是一款成熟的大众化产品,但不失为一项有潜力的开发项目。苹果从年就开始重写Mac操作系统,对于翘首盼望多年的业界人士而言,推出Mac OS X .0本身就是一项了不起的成就。除去一些较小的补丁,Max OS X的稳定性也颇具口碑,系统内核的错误比以往大大减少了。对它的批评主要是慢,与年九月的Mac OS X公开试验版相比,猎豹并没有跑得更快些。
Mac OS X v.1 (Puma)
在该年之后的 年9月日,Mac OS X v.1(代号为 Puma)推出,增加了系统的效能和提供不存在的特色,像是 DVD 播放。由于 .0 的不好名声,苹果为 .0 的使用者推出免费的升级 CD,此为对于只有运行 Mac OS 9 的人推出 9 美元的盒装版本。有人发现升级的 CD 其实就是完整的安装光盘,只要移除一个特定的档案就能够在 Mac OS 9 系统使用;苹果随后重新推出该 CD,实际上真的是把不必要的缩减掉,使得无法在这样的系统上安装。
Mac OS X v.2 "Jaguar"
在年8月日,苹果接着推出 Mac OS X v.2 "Jaguar"(第一次公开地使用他的猫科名称推出),带来彻底的效能增强,新的且光鲜的外观,以及很多巨大的改进(根据苹果有个),在这些中有:
* 增加对于 Microsoft Windows 网络的支援
* Quartz Extreme 直接在显示卡上合成图形
* 以latent semantic indexing为基础,一个调适性的垃圾邮件过滤
* 在新的 Apple Address Book 中对于联络资料的系统贮存空间
* Rendezvous 网络(苹果的 Zeroconf 实作;于 .4 更名为 Bonjour)
* iChat:以 Apple 为商标,官方支援的 AOL 即时传讯 之客户端
* 重新翻修的 Finder,直接在每个视窗内建搜寻功能
* 很多的新 Apple Universal Access 特色
* Sherlock 3: 网页服务
* CUPS:Common Unix Printing System,允许为不支援的打印机使用 GIMP 打印驱动程序,hpijs 驱动程序等等。它也允许打印到序打印表机。
虽然包装和 CD 仍然是带有 Jaguar 外观的商标,由于与汽车制造商 Jaguar 的协议,在英国官方上不曾把 Mac OS X v.2 和 Jaguar 关联在一起。
Mac OS X v.3 "Panther"
Mac OS X v.3 "Panther" 于 年月日 推出。除了提供更多效能的改进外,它也针对使用者接口有大规模的更新。这些更新包含了跟该年之前 Jaguar 所有的多种特色。 另一方面,中断了对于某些老旧的 G3 米**世代电脑的支援。"Panther" 的新特色包含:
* Finder 更新,结合金属触感接口和快速搜寻
* Exposé:用来操作视窗接口的新系统
* 快速使用者切换:允许使用者维持登入状态而换另外一个使用者登入。
* iChat AV 增加了视讯会议功能到 iChat
* 改进 PDF 显现而使得 PDF 能够极快速地浏览
* 内建支援传真
* 更多与 Microsoft Windows 的兼容支援
* FileVault:对于使用者目录直接加密解密
* 针对PowerPC G5提供更多的支援,增加整个系统的速度
* Safari:网页浏览器
Mac OS X v.4 "Tiger"
Mac OS X v.4 "Tiger" 是在 年4月日 推出。苹果宣称 Tiger 包含 种以上新功能,但就像是 Panther 的发行推出一样,某些更老的机器已经从支援的硬件列表中去除。在 "Tiger" 中有以下这些新特色:
* Spotlight:一种快速的内容和 metadata 基础的档案搜寻工具,能够快速地找到你所搜寻的关键字项目列表。
* Dashboard:在桌面上只需要一次鼠标点击就出现且提供通用工作的 Widget
* iChat:为视讯会议支援 H. 视讯编码的新版本,且允许多方语音和影像聊天。
* QuickTime 7:包含 H. 支援的新版本,以及完全重新撰写的接口
* Safari 2:新版本的系统缺省网页浏览器,在其他新特色中,包含能够直接在浏览器检视 RSS feed 的能力。
* Automator:自动重复性的任务而不需要程序设计方式
* Core Image 和 Core Video:允许实现即时的影像或编辑时额外的效果。
* 对于 PowerPC G5 的 位元 内存支援,使用 LP 系统
* 更新 Unix 的工具,像是 cp 和 rsync,可以保存 HFS Plus metadata 和 resource forks
* 使用存取控制列表的扩充权限系统
Mac OS X v.5 "Leopard"
Mac OS X v.5 "Leopard" 是于 年 6月6日的世界开发者大会中所宣布的,将会在 年 后期或 年 早期推出。苹果电脑宣称它将会同时支援 PowerPC 和以 Intel 为基础的麦金塔电脑。
‘陆’ 苹果电脑怎么做系统
1、在桌面顶部点击前往—实用工具;
‘柒’ 苹果电脑是什么系统
苹果电脑是Mac OS系统。
Mac OS是一套运行于苹果Macintosh系列电脑上的操作系统。Mac OS是首个在商用领域成功的图形用户界面操作系统。现行的最新的系统版本是OS X . Yosemite,且网上也有在PC上运行的Mac系统,简称Mac PC。
Mac系统是基于Unix内核的图形化操作系统;一般情况下在普通PC上无法安装的操作系统。由苹果公司自行开发。苹果机的操作系统已经到了OS ,代号为MAC OS X(X为的罗马数字写法),这是MAC电脑诞生年来最大的变化。
Mac OS系统的主设计人:
Mac OS 9.0是比尔·阿特金森、杰夫·拉斯金和安迪·赫茨菲尔德,是乔布斯还在苹果的时候开发的,后来他离开苹果创立NeXT后为其开发了另一套系统。
主设计人是艾维·特万尼安(Avie Tevanian),乔布斯回归苹果后逐渐抛弃了以前的代码,在发布Mac OS X时,正式使用艾维·特万尼安当时编写的代码作为其主代码。
‘捌’ 苹果电脑是什么操作系统
MAC OS 操作系统
Mac OS是一套运行于苹果Macintosh系列电脑上的操作系统。Mac OS是首个在商用领域成功的图形用户界面操作系统。现行的最新的系统版本是OS X . Yosemite,且网上也有在PC上运行的Mac系统,简称 Mac PC。
Mac系统是基于Unix内核的图形化操作系统;一般情况下在普通PC上无法安装的操作系统。由苹果公司自行开发。苹果机的操作系统已经到了OS ,代号为MAC OS X(X为的罗马数字写法),这是MAC电脑诞生年来最大的变化。新系统非常可靠;它的许多特点和服务都体现了苹果公司的理念。
另外,疯狂肆虐的电脑病毒几乎都是针对Windows的,由于MAC的架构与Windows不同,所以很少受到病毒的袭击。MAC OSX操作系统界面非常独特,突出了形象的图标和人机对话。苹果公司不仅自己开发系统,也涉及到硬件的开发。
‘玖’ Mac操作系统是什么的
Mac OS X 是苹果麦金塔电脑之操作系统软件的 Mac OS 最新版本。Mac OS X 于 年 首次在商场上推出。它包含两个主要的部份:Darwin,是以 BSD 原始码和 Mach 微核心 为基础,类似 Unix 的开放原始码环境,由苹果电脑采用和与独立开发者协同作进一步的开发;及一个由苹果电脑开发,命名为 Aqua 之有版权的 GUI。
Mac OS X Server 亦同时于年发售. 架构上来说与工作站(客户端)版本相同,只有在包含的工作群组管理和管理软件工具上有所差异,提供对于关键网络服务的简化存取,像是邮件传输服务器, samba 软件,LDAP 目录服务器,以及名称服务器(DNS)。同时它也有不同的授权型态。
命名
X 这个字母是一个罗马数字且正式的发音为 "十"(ten),接续了先前的麦金塔操作系统像是 Mac OS 8 和 Mac OS 9 的编号。某些人把它读作 X 字母且发音为 "ex"。对于这个直接解读的原因是对于 Unix-like 操作系统的传统命名会以字母 "x" 作为结尾 (例如 AIX, IRIX, Linux, Minix, Ultrix, Xenix)。另外一个原因是苹果电脑的倾向提及特别的版本是以(例如) "Mac OS X 版本 .4" 印刷出来。
Mac OS X 版本以大型猫科动物命名。比他的推出更重要的,在苹果电脑内部 .0 版本的代号是猎豹(Cheetah),以及 .1 版本代号为美洲狮(Puma)。在苹果的产品市场 .2 版本命名为 美洲虎(Jaguar),以及 .3 相似地命名为 黑豹(Panther)。.4 版已经被公开命名为 老虎(Tiger)。花豹(Leopard) 当作下一个推出的操作系统。苹果电脑也已经注册山猫(Lynx)和美洲狮(Puma在美洲的惯用词,Cougar)当作未来使用的商标。
由于苹果使用 "Tiger" 这个名称,面对到名称为 TigerDirect 电脑零售商的法律诉讼。然而,在 年5月日,佛罗里达州联邦法庭裁决苹果电脑使用 "Tiger" 的名称并没有侵害到 TigerDirect 的商标。
苹果电脑的网站和文章中提及特殊的 Mac OS X 版本会以四种不同的方式呈现:
* Mac OS X v.4,版本号码
* Mac OS X Tiger,版本的代号名称
* Mac OS X v.4 "Tiger",版本号码和名称,苹果有时会省略引号。
* "Tiger",简单地版本名称