Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314699
  • 博文数量: 78
  • 博客积分: 3635
  • 博客等级: 中校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-28 09:35
文章分类

全部博文(78)

文章存档

2011年(13)

2010年(65)

我的朋友

分类: LINUX

2010-11-09 13:32:56


如果你是首次安装:请一定要阅读从这里到安装部分结束的所有内容,并且追踪你所遇到的链接。如果你有任何其它问题,返回到目录并搜索主题,读取,或者尝试用grep搜索整个文件。

这个文件的主要原则:如果一个功能没有被编入文档,那么它不存在。如果我没有说你能用电视选台器音频编码,你就不能。不过健康程度的综合能力还是受欢迎的。祝你好运。你将需要它的:),让我引用邮件列表中 Chris Phillips的话作为另一个好的建议:

“我以前说过新手和白痴之间的区别在于:无论,你实际上对一个系统(Linux,汽车,女孩:D) 了解多少,你应该总能够退一步想想并且保持客观,否则,恕我直言你是公认的白痴。跟我住在一起的女孩认定吸尘器坏了因为它不吸进东西,而从不想更换袋子,因为她以前从来没有做过...那就是愚蠢,而不仅仅是不知道做什么...仅仅因为不是那么熟悉你的环境不是你的a)懒惰和b)忽视的借口。如此多人们似乎看到“error” 就停止...只有极少数真正读取了冒号另一边的东西”。

MPlayer是Linux 上的电影播放器(也能跑在许多其它Unices上,甚至非x86CPU上,参见移植部分)。它能使用众多的本地的,XAnim,RealPlayer,和Win32 DLL编解码器,播放大多数MPEG,VOB,AVI,OGG,VIVO,ASF/WMV,QT/MOV,FLI,RM,NuppelVideo,yuv4mpeg,FILM,RoQ文件。你还能观看VideoCDSVCDDVD3ivxRealMedia,和DivX格式的电影(你根本不需要avifile库)。mplayer的另一个大的特色是广泛的输出设备支持。它可以在X11,Xv,DGA, OpenGL,SVGAlib,fbdev,AAlib,DirectFB下工作,而且你也能使用GGI和SDL(由此可以使用他们支持的各种驱动模式) 和一些低级的硬件相关的驱动模式(比如Matrox,3Dfx和Radeon,Mach64,Permedia3)!他们大多数支持软件或者硬件缩放,因此你能在全屏下观赏电影。MPlayer还支持通过硬件MPEG解码卡显示,诸如。可以使用European/ISO 8859-1,2(匈牙利语,英语,捷克语等等),西里尔语,韩语的字体的清晰放大并且反锯齿的字幕(支持10种格式),和on screen display(OSD)你又觉得如何?

这个播放器能够稳如泰山的播放被破坏的MPEG文件(对一些VCD有用),而它能播放著名的windows media player 都打不开的的坏的AVI文件。甚至,没有索引部分的AVI文件可播放,你能暂时由重建他们的索引-idx选择,或者用MEncoder永久重建,使你能够在影片中搜索!如你所见,稳定和质量是最重要的事情,而且他的速度是也惊人的。

MEncoder(MPlayer‘s Movie Encoder)是一个简单的电影编码器,设计用来把MPlayer可以播放的电影 (AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA)编码成别的MPlayer可以播放的格式(具体列表见下面)。它可以使用各种编解码器进行编码,例如 DivX4(1或2 passes),libavcodec, PCM/MP3/VBR MP3音频。同时也有强大的插件系统用于控制视频。

MEncoder的特性

  • 从MPlayer支持的广泛的文件格式和解码器的输入进行编码
  • 编码到ffmpeg的的所有编解码器
  • V4L兼容的电视选台器输入编码
  • 编码/多路传输成具有适当索引的交错的AVI文件
  • 从外部音频流创建文件
  • 1, 2或3 pass编码
  • VBR的MP3音频 - 重要提示: VBR MP3音频不总是能被Windows的播放器正常的播放!
  • PCM音频
  • 流复制
  • 输入的自动A/V同步(基于PTS,使用-mc 0选项来禁用)
  • 使用-ofps选项进行FPS修正(当把29.97fps的VOB编码成24fps的AVI的时候有用)
  • 使用我们强大的插件系统(crop, expand, flip, postprocess, rotate, scale, rgb/yuv conversion)
  • 可以把DVD/VOB字幕文本字幕编码到输出文件中
  • 可以把DVD字幕提取为Vobsub格式

计划中的特性

  • 更加广泛的编/解码格式/编解码器 (用DivX4/Indeo5/VIVO流创建VOB文件:)

MPlayer和MEncoder按照GNU General Public License Version 2发布。

这一年以前开始的... 我(A‘rpi)已尝试Linux下的许多播放器(mtv,xmps,dvdview,livid/oms,videolan,xine,xanim,avifile,xmmp),但是他们全都有一些问题。多半与特殊的文件或音频与视频的同步有关。他们中大多数不能同时播放MPEG1,MPEG2和AVI(DivX)文件。许多播放器也有图象质量或者速度的问题。因此,我已决定自己写/修改一个...

  • mpg12play v0.1-v0.3:2000年9月22-25日
    第一次尝试,总共只用了半小时来hack!到版本0.3我都使用的libmpeg3,但是它有图象质量和速度的问题。
  • mpg12play v0.5-v0.87:2000年9月28日-10月20日
    用Dirk Farin的DVDview替换了原来的Mpeg codec,它是一个很不错的东东,但是它很慢并且使用写成C++(我讨厌C++!!!)
  • mpg12play v0.9-v0.95pre5:2000年10月21日-11月2日
    Mpeg codec改用Aaron Holtzman与的Michel Lespinasse的libmpeg2(mpeg2dec)。它十分出色,优化过的十分快速的C代码和完美的图象质量以及100%的MPEG标准的一致性。
  • MPlayer v0.01: 2000年11月11日
    第一个MPlayer。
  • MPlayer v0.3-v0.9:2000年11月18日-12月4日
    它包含两个程序: mpg12play v0.95pre6和我的新的简单的基于avifile的Win32 DLL Loader的AVI播放器‘avip‘。
  • MPlayer v0.10:2001年1月1日
    MPEG和AVI播放器做成了一个二进制文件!
  • MPlayer v0.11pre系列:
    一些新的开发者加入了,从0.11开始mplayer项目成为一个team-work!增加了.ASF文件支持,和OpenDivX(见)编/解码支持。
  • MPlayer v0.17a“IdegCounter”2001年4月27日
    在艰苦发展了4个月的0.11pre之后的正式版本!试试看,然后等着被震撼!成千上万的新的特性添加...当然同时旧的代码也被改进,移去了一些bug
  • MPlayer 0.18“BugCounter”2001年7月9日
    0.17发布2个月后的新的正式版。完全的ASF支持,更多字幕格式,引入libao(类似于libvo但是针对音频),比以往任何时候更加稳定,如此等等。这肯定是个必需品!
  • MPlayer 0.50“Faszom(C)ounter”2001年10月8日
    Hmm。又一次新版本。众多新的特性,Beta版的GUI,bug修正,新的vo和ao驱动模式,许多系统的移植,包括opensource DivX codecs和更多得多的改进。尝试一下!
  • MPlayer 0.60“RTFMCounter”2002年1月3日
    支持MOV/VIVO/RM/FLI/NUV文件格式,本地的CRAM,Cinepak,ADPCM 编解码器,支持XAnim的二进制的编解码器;DVD字幕支持,首此发布MEncoder,电视截取,缓存,liba52,无数的修正。
  • MPlayer 0.90pre10 "The BirthdayCounter" 2002年11月11日
    尽管这不是一个正式发行版,但我决定提到它因为它诞生在MPlayer v0.01发布的两年之后。生日快乐,MPlayer!
  • MPlayer 0.90rc1 "The CodecCounter" Dec 7, 2002
    同样不是一个正式发行版,但在添加了Sorenson 3(QuickTime)和Windows Media 9的支持之后, MPlayer成为世界上第一个支持所有已知视频格式的电影播放器!
  • MPlayer 0.90“?”日期未知

在这章中我将试图指引你通过编译和配置MPlayer的过程,它不大容易的,不过也见得一定很难的。如果你遇到不同于我所解释的现象,请的通过搜索这篇文件来查找你的回答。如果你遇到链接,请跟踪他们并且细心读取他们包含的内容。它将花费一些时间,但是它确实是值得的。

你需要一个相当新的系统。在Linux上,推荐2.4.x的内核。

软件要求:

  • binutils -- 建议版本2.11.x。这个程序负责生成MMX/3DNow!/etc指令,因此十分重要。
  • gcc -- 建议版本是:2.95.3(或者2.95.4)和3.2+永远不要使用2.96或者3.0.x!他们产生错误的MPlayer的代码。如果你决定更换2.96的gcc,那么不要只是因为新而决定采用3.0.x!3.0.x的早期版本甚至比2.96更buggy。因此不如降级到2.95.x(也把libstdc++降级,其它程序可能需要它)或者根本不升/降级(但这种情况下请对运行时的问题作好准备)。如果你一定要使用3.x.x请使用最新的版本,早先的发行版本有各种各样的错误,确信你使用的至少是3.1,它通过测试且工作正常。关于gcc 2.96的bug(仍然没有修正,他们在MPlayer中被绕过!)的详细信息能在这里和中找到。
  • XFree86 -- 建议总使用最新版本(4.2.1)。正常来说,每个人会这样做,因为XFree86从4.0.2开始,它包含了用来使其能够在它支持的卡片上使用硬件YUV加速(快速的图象显示)的扩展(在某些地方被称作Xv)。
    确保也安装了开发包,否则它将不工作。
    对于一些视频卡你不需要XFree86。参见下面的列表。
  • make -- 建议总使用最新版本(至少3.79.x)。这通常不太重要。
  • SDL -- 它不是必须的,但是在某些情况下(损坏的音频,在xv驱动模式下奇怪地延迟的显卡)能帮助。总使用最新(1.2.x或以上)的。
  • libjpeg -- 可选的JPEG解码器,用于-mf参数和一些QT MOV文件。如果你计划做jpeg文件的工作那么MPlayer和MEncoder都需要它。
  • libpng -- 推荐也是默认的( M)PNG译码器。GUI需要它。对MPlayer和MEncoder也有用。
  • lame -- 推荐,MEncoder需要用它把音频做MP3编码,建议总使用最新版本(3.90或以上)。
  • libogg -- 可选,用于播放OGG文件格式。
  • libvorbis -- 可选,用于播放OGG Vorbis音频。
  • -- 可选,用于播放RTSP/RTP流。
  • directfb -- 可选,从获得
  • cdparanoia -- 可选,用于CDDA支持
  • libfreetype -- 可选,用于TTF字体支持。至少需要2.0.9以上版本。
  • libxmms -- 可选, 用于XMMS输入插件的支持。要求至少1.2.7以上版本。

编解码器:

  • libavcodec:这个编解码器包可以在多重平台上对H263/MJPEG/RV10/DivX3/DivX4/DivX5/MP41/MP42/WMV1编码格式的视频流和 WMA(Windows Media Audio)v1/v2的音频流进行解码,它同时也是已知完成这些任务最快的解码器。详细情况请看部分。特性
    • 在非x86机器上的对上述的各种编码格式解码。
    • 以上述大多数编码格式编码。
    • 这是可用的最快的DivX/3/4/5和其它MPEG4类型的解码器,高度推荐。
  • Win32编解码器:如果你计划在x86构架的机器上使用MPlayer,你将有可能需要他们。在开始MPlayer的编译之前从我们的下载Win32编解码器并安装到/usr/lib/codecs,否则将不会编译Win32支持代码!
    注意: avifile项目有类似的codecs包,但是它不同于我们的,如此如果你想使用所有支持的编解码器,安装我们的包(别担心, avifile使用它不会有任何问题).特性:
    • 如果你想要播放或者编码例如以各种各样的硬件压缩器记录的电影,像选台器卡,数码相机(例如:DV,ATI VCR,MJPEG),你将需要它
    • 如果你想要播放WMV8,WMV9/WMA9格式的电影那就需要它。播放老的以MP41或者MP42视频的ASF(尽管这些文件的音频常常是VoxWare -- 它是通过Win32编解码器解码的),或者WMV7是不需要它的。
  • QuickTime编解码器:在x86平台上这些编解码器可以用来解码Sorenson v1/v3, RPZA, 和其他QuickTime视频,和QDesign音频流。 安装方法可以在部分找到。
  • DivX4与DivX5:关于这编码格式的信息可从节得到。如果你不想用它来编码,你有可能不会想要这个解码器,因为libavcodec(见上面)比它快得多。
    特性:
    • 用进行1 pass或2 pass编码。
    • 播放老的DivX3格式的电影比Win32 DLL快得多但是比libavcodec慢!
    • 它封闭源码的,而且仅仅有一个x86平台的版本。
  • XviD:开源的Divx4Linux的编码替代品
    特色:
    • 用进行1 pass或2 pass编码。
    • 这是开源的,所以是多平台的。
    • 它的编码速度比divx4快2倍 -- 在几乎相同的质量的情况下
  • 对解码3ivx和Indeo 3/4/5格式,和一些旧的格式的电影效果是最好(全屏幕,硬件YUV缩放)。同时,他们是多平台的,因此这是在非x86平台上播放Indeo的唯一的方法(当然,除了直接使用XAnim之外:)。但是例如Cinepak电影MPlayer自己的Cinepak解码器播放才有最好的效果!
  • 对于Ogg Vorbis音频解码你需要正确地安装libvorbis。如果可能的话尽量使用deb/rpm包装,或者用编译(这是Vorbis CVS的每天最新的tarball)。
  • MPlayer能使用RealPlayer 8或RealONE的库来播放包括RealVideo 2.0 - 4.0格式的视频和Sipro/Cook格式的音频的文件。安装方法以及关于它的更多信息参见部分!

显卡

一般地显卡可分为两种。一种(较新的显卡)支持硬件缩放和YUV加速,另一种卡没有。

YUV显卡

他们能在他们显存可以的范围中用任何分辨率显示和缩放(zoom)图像,只占用很少的CPU(即使在放大的时候),所以你能得到清晰而且飞快的全屏播放。

  • Matrox G200与G400与G450与G550显卡:虽然提供了一个,但还是推荐使用旧的mga_vid内核模块,因为它工作起来好得多。关于其安装和使用参见部分。在编译MPlayer之前进行这些步骤这一点很重要,否则不会编译mga_vid的支持代码。同时也请查看部分。 如果你是非Linux用户,你的唯一的选择是VIDIX驱动:请看部分!
  • 3Dfx Voodoo3与Banshee显卡:请参见部分以了解如何获得大幅的速度提升。在编译MPlayer之前进行这些步骤这一点很重要,否则不会编译3Dfx的支持代码。也请参考部分。如果你使用X,至少使用4.2.0版本,因为4.1.0和更早发行版本的3dfx的Xv驱动是坏的!
  • ATI显卡:下列的显卡提供了:RadeonRage128Mach64(Rage XL/Mobility,Xpert98)。也请参考电视输出文档中的部分,看看Linux与MPlayer是否支持你的显卡的电视输出。
  • S3显卡:Savage和Virge/DX芯片有硬件加速功能。尽可能使用最新的XFree86版本,老的的驱动很buggy。 Savage的芯片的YV12显示有问题,具体细节请看部分。更老的,Trio显卡没有,或只有很慢的硬件加速功能。
  • nVidia显卡:可能是也可能不是视频播放的好的选择。如果你没有一个GeForce2(或更新的)显卡,你不太可能在运行中不遇到bugs。 XFree86中内建的nVidia驱动不支持所有nVidia显卡(GeForce2以下)的硬件YUV加速。你必须从nVidia.com下载nVidia的封闭源码的驱动。细节参见部分。同时也查看如果你希望使用一个电视。
  • 3DLabs GLINT R3和Permedia3:提供VIDIX驱动(pm3-vid)。细节参见部分。
  • 其它卡片:不是上述的任何一个?
    • 试试XFree86的驱动(和你的显卡)是否支持硬件加速。细节参见。
    • 如果不是,那么你的操作系统不支持你显卡的视频特性:(
      如果它在Windows下能够使用硬件缩放,那并不不意味着在Linux或者其它OS下做同样的事情,它依赖于驱动!大多数制造厂不做Linux驱动也不公布芯片标准 -- 所以,使用他们的显卡你很不走运。看‘非YUV显卡’:

非YUV卡片

可以通过使用软件缩放(使用-zoom或者-vf scale参数,但是我先警告你:这会比较慢),或者通过切换成较小的的分辨率来实现全屏播放,例如352x288。如果你没有YUV加速,我们推荐使用后一种方法。视频模式切换通过-vm选项打开,它能用于下列驱动:

  • 使用XFree86:细节参见和部分。推荐使用DGA!也可以尝试通过SDL使用DGA,有时这种办法更好。
  • 不使用XFree86:按下列顺序尝试驱动模式:,fbdev, ,。

某些显卡:

  • Cirrus Logic显卡:
    • GD 7548: 板载显卡并用Compaq Armada 41xx系列的笔记本测试。
      • XFree86 3:能使用8/16bpp模式。然而,这个驱动在800x600@16bpp下狂慢而且buggy推荐: 640x480@16bpp
      • XFree86 4: 如果不仅用加速Xserver会在启动后不久失去响应,但这样之后就比XFree86 3慢了。没有XVideo
      • FBdev: 这个显卡只兼容VBE 1.2,所以VESA帧缓冲用不了,当尝试用UniVBE来绕过时, 帧缓冲显示的全是碎片根本用不了。
      • VESA: 这个显卡只兼容VBE 1.2,所以VESA输出用不了。无法通过使用UniVBE解决
      • SVGAlib: 检测成更老的Cirrus芯片. 用-bpp 8可以使用但很慢

声卡

  • Soundblaster Live!:通过这种声卡你能使用4或者6(5.1)声道AC3解码而不只是2声道。请看一节。对于硬件AC3输出你必须使用ALSA 0.9的oss仿真!
  • C-Media的SP/DIF输出:这些声卡可以使用硬件AC3输出,参见一节。
  • 其它声卡的特性MPlayer是不支持的。 强烈建议阅读部分!

特性

  • 考虑一下你是否需要GUI。如果需要,在进行编译之前,请看GUI部分。
  • 如果你想要安装MEncoder(我们的强大的全功能编码器),请看。
  • 如果你有一张V4L兼容的电视选台器的卡,并且希望用MPlayer观看/截取并且录制电影,请看电视输入一节。
  • 有一个精致的OSD菜单可供使用。查看OSD菜单部分。

接着编译MPlayer:

    ./configure
make
make install

到此为止,MPlayer就可以使用了。$PREFIX/share/mplayer目录下包含了codecs.conf文件,程序通过它来了解所有的编解码器和他们的能兼容的格式。该文件应该与主程序一起更新!
检查在你的home目录(~/.mplayer/codecs.conf)中是否有旧的MPlayer版本留下的codecs.conf,如果有就删掉它!

Debian的用户能自己制作.deb安装包,这十分简单。直接在MPlayer的根目录下执行fakeroot debian/rules binary。详尽的步骤请看Debian安装包的制作

./configure的输出请务必一定阅读,还有configure.log文件,其中的信息会告诉你将什么将被编译,什么将不编译。你也可能需要查看config.hconfig.mak文件。
如果你已经安装一些库文件,却没有被./configure发现,那么检查你是否也安装了正确的头文件(通常在-dev包中)以及他们的版本符合要求。 configure.log通常会告诉你缺什么。

尽管并非必需,你确实应该安装字体以使用OSD和字幕功能。推荐的方法是安装一个TTF字体文件并让MPlayer使用它。阅读字幕和OSD一节来了解其细节。

GUI需要GTK 1.2.x(它不是GTK的,但是面板是的)。skin被保存为PNG格式,因此你需要安装gtk,libpng(和他们的devel包,一般是gtk-dev和libpng-dev)。你必须在运行./configure时使用--enable-gui来编译它的代码。然后,你可以用下列方法之一打开GUI方式

  • 在你的config文件中添加gui=yes
  • ln -s $PREFIX/bin/mplayer $PREFIX/bin/gmplayer,然后运行gmplayer

目前由于技术原因,目前你不能在命令行下使用-gui选项。

因为MPlayer不自带skin,所以如果你想要使用GUI,你必须自己下载它们。参见。他们应该被解压到系统通用的目录($PREFIX/share/mplayer/skins/),或者解压到$HOME/.mplayer/skins/。 MPlayer在默认情况下会在这些的目录里寻找一个叫default的目录,但是你能使用-skin newskin选项或在config文件中添加skin=newskin来强制使用*/skins/newskin目录下的skin。

MPlayer能在播放电影的同时显示字幕。目前支持下列格式:

  • VobSub
  • OGM
  • CC (closed caption)
  • Microdvd
  • SubRip
  • SubViewer
  • Sami
  • VPlayer
  • RT
  • SSA
  • MPsub
  • AQTitle
  • JACOsub

MPlaye可以把上面列出的字幕格式(除了前三个)转换成下列的格式,使用下列选项:

  • MPsub: -dumpmpsub
  • SubRip: -dumpsrtsub
  • Microdvd: -dumpmicrodvdsub
  • JACOsub: -dumpjacosub
  • Sami: -dumpsami

使用不同格式的命令行选项稍有不同:

VobSub字幕

VobSub字幕包括一个大的(几兆).sub文件,和可选的.idx和/或者.ifo文件。
用法: 如果你有类似sample.subsample.ifosample.idx之类的文件 -- 你必需使用-vobsub sample -vobsubid 的参数(当然必要时加上路径)。 -vobsubid 选择类似于播放DVD时的-sid,用它你可以选择不同的字幕轨道(语言)。当省略-vobsubid选项时, MPlayer将尝试使用-slang中指定的语言,如果没有找到将使用.idx文件中的langidx项指定的语言,如果这些尝试都失败了,那就将没有字幕显示。

其它字幕

其它格式由一个单一的包含时间,位置和正文信息的文本文件组成。
用法: 如果你有类似sample.txt之类的文件,你必须使用-sub sample.txt (可以加上完整路径)。

调整字幕的时间和位置

-subdelay
延迟字幕< sec >秒。可以是负数。
-subfps
规定字幕文件按每秒多少帧速度显示(浮点数)
-subpos<0-100>
规定字幕显示的位置。

如果你使用MicroDVD字幕文件时遇到电影和字幕之间的延迟不断增加的问题,很有可能你的电影文件和字幕文件的帧速度不同。
请注意,MicroDVD字幕格式用绝对帧数来计时,因此-subfps选项不能用于这种格式。因为MPlayer没法猜测字幕文件的帧速度,你必须手工修改它。在MPlayer的FTP站点的contrib目录中有一个小的perl脚本可以替你做这种转化。

当你播放一个电影时MPlayer将尝试猜测你想要使用的字幕文件,在大多数情况下,字幕文件和电影文件在同一个目录下,并且有相同的名字,你不需要设置有关字幕的选项,只要正常播放电影就可以了,MPlayer会自动播放字幕。

关于DVD字幕,请看一节。

MPlayer引入一种称为MPsub的新的字幕格式。它由Gabucino设计。基本上,其主要的特性是基于动态时间 (虽然它有基于帧的模式)。例如(引自):

# first number : wait this much after previous subtitle disappeared
# second number : display the current subtitle for this many seconds

15 3
A long long, time ago...

0 3
in a galaxy far away...

0 3
Naboo was under an attack.

因此如你所见,主要的目标是使字幕的编辑/计时/合并/分割变得容易。同时,如果你 -- 比方说 -- 有一个SSA字幕但是它与你的电影却有严重的时间/延迟问题,你只要简单运行mplayer dummy.avi -sub source.ssa -dumpmpsub。在当前目录中将生成一个dump.mpsub文件,它包含源字幕的正文,但是使用MPsub格式。然后,你就能字幕中自由地添加或减去任意秒。

字幕的显示使用一种称为‘OSD‘, On Screen Display的技术。OSD被用来显示当前的时间,音量条,进度条等等。

你需要一个MPlayer字体包来使用OSD和字幕功能。有许多方法获得它:

  • 从MPlayer站点下载准备好的字体包。注意:当前可用的字体限仅限于iso 8859-1/2的支持,但在FTP占的contrib/font部分有其它一些(包括朝鲜语,俄语,8859-8等等)用户制作的字体。
    字体应该有正确的font.desc文件用来把unicode中字符位置映射到字幕文件实际使用的编码页。另一种解决方法是把字幕用utf8格式编码然后使用-utf8选项或者将字幕文件命名为.utf放在与视频文件相同的目录中。将不同的编码页转换到utf8编码可以通过使用 konwert(Debian)或者iconv(Red Hat)程序完成。
    一些URL:
    • -- ISO字体
    • -- 用户制作的各种各样的字体
    • -- 朝鲜字体 & RAW的插件
  • 使用TOOLS/subfont-c下的字体制作工具,它是一个能将TTF/Type1等字体转换成mplayer字体包的一个完整的工具。 (详细情况请看TOOLS/subfont-c/README)
  • 使用TOOLS/subfont-GIMP下的GIMP字体生成插件(注:你同时也必须有HSI RAW插件,见下面的URL)
  • 使用TrueType(TTF)字体,通过freetype库。必须使用2.0.9或更高的版本!然后你有两种方法:
    • 使用-font /path/to/arial.ttf选项来在每次播放时指定一个TrueType字体文件/LI>
    • 创建一个符号链接:ln -s /path/to/arial.ttf ~/.mplayer/subfont.ttf

如果你使用非TTF字体,把你下载的文件UNZIP到~/.mplayer或者$PREFIX/share/mplayer。然后将其中之一改名或者符合链接为font(例如:ln -s ~/.mplayer/arial-24 ~/.mplayer/font)。你现在应该在电影的左上角看见一个计时器(用"o"键可以关上它)。

OSD有4种状态:(用‘o‘键切换)

  • 音量条+进度条(默认)
  • 音量条+进度条+计时器+搜索中显示文件位置百分比
  • 音量条+进度条+计时器+媒体总时间
  • 只有字幕

你能通过在config文件中设置osdlevel=变量,或者用命令行选项-osdlevel来改变默认行为。

MPlayer有一个完全用户自定义的OSD菜单接口。

注意:Preferences菜单目前不能使用!

安装

  1. 编译MPlayer时在./configure时加上--enable-menu参数
  2. 确保你安装了OSD字体
  3. etc/menu.conf复制到你的.mplayer目录
  4. etc/input.conf复制到你的.mplayer目录,或者系统通用的MPlayer配置目录(默认为:/usr/local/etc/mplayer)
  5. 检查并编辑input.conf来启用菜单控制键(在那里有描述).
  6. 像下面的例子这样启动MPlayer:
    $ mplayer -menu file.avi
  7. 按你所定义的菜单键

在MPlayer中有三种计时方法。
  • 使用老方法,你不必做任何事情。它使用usleep()调整A/V同步,达到+/-10ms的准确性。但有些情况下同步应该调整的更精确。
  • 新的定时器代码使用PC的RTC(Real Time Clock)完成这个任务,因为它有精确到1ms的计时器。当它可用时会自动使用它,但需要root权限,或一个setuid root的二进制的MPlayer或者一个适当配置的内核。
    如果你使用2.4.19pre8或以上的内核你能通过/proc文件系统来调整普通用户的最大RTC频率。使用下列命令来允许普通用户使用RTC:

    echo 1024 > /proc/sys/dev/rtc/max-user-freq

    如果你没有这么新的内核,你也可以修改drivers/char/rtc.c中的一行并且重新编译你的内核。找到下面这一段
    	 * We don‘t really want Joe User enabling more
        * than 64Hz of interrupts on a multi-user machine.
        */
        if ((rtc_freq > 64) && (!capable(CAP_SYS_RESOURCE)))
        
    把64改成1024。当然你应该确实明白你做了什么。
    你能在状态行上看到新的计时器的效果。
    一些使用speedstep功能CPU的笔记本的BIOS的电源管理不能很好的与RTC协同工作。音频和视频可能会不同步。在给你的笔记本加电之前将外部电源接上似乎会有帮助。你总能用-nortc选项关闭RTC支持。一些硬件连接器(在ALi1541主板上使用非DMA的DVD光驱上)RTC定时器的使用会造成跳跃的播放。在这些情况下,推荐使用下面的方法。
  • 第三个定时器代码可以用-softsleep选项打开。它有RTC的效果,但是它不使用RTC。另一方面,它要使用更多的CPU。
    注意:永远不要将setuid root的MPlayer安装在多用户系统上!这显然会让任何人得到root权限。

    & 输出模式

    这段将要如何能够使用V4L兼容的电视选台器观看与截取。电视相关的选项和键盘控制的描述请看man page。

    1. 首先,你必须重新编译。./configure将自动检测v4l的内核头文件和/dev/video* 输入的存在。如果他们存在,电视支持将被编译(检查./configure的输出)。
    2. 确保你的选台器能被别的Linux中的电视软件使用,例如xawtv。

    可用选项的完整列表在manual page中。这里只是一些使用技巧:
    • 使用channels选项。例如:
      -tv on:channels=26-MTV1,23-TV2
      解释:使用这个选项,只有26和23频道可以使用,当频道切换时会有一个显示频道名的精致的OSD文字。频道名中的空格必须用"_"代替。
    • 选择完整的图像分辨率。输出图像的分辨率必须能够被16整除。
    • 如果你截取视频的垂直分辨率比完整分辨率的一半还高(PAL制是288,NTSC是240),确保你打开非交错选项,否则你得到的电影将在高速运动的场景中发生扭曲,而且由于交错模式产生大量的细节消耗很多带宽,比特率控制器很可能无法获得指定的比特率。你能使用-vf pp=DEINT_TYPE打开非交错选项。一般来说pp=lb工作的不错,但这可能取决于个人的设定。查看manual中的别的非交错算法,都尝试一下。
    • 切割到无用的空间。当你截取视频时,边界区域通常时黑的或者包含一些噪音。这同样不必要的消耗了很多带宽。更精确的说不是那些黑的区域本身而是在黑的和更亮的视频图像之间的形状变换消耗带宽,但现在这并不重要。在你开始截取之前,调整crop选项的参数使所有边缘的废物都被切割掉。同时,别忘了保持完整的输出图像的分辨率。
    • 注意CPU的工作量。它在大多数时间不应该超过90%的界限。如果你有一个大的截取的缓冲区,MEncoder可以忍受几秒钟的过载但不能再多了最好把3D的OpenGL屏保和类似的东西关掉。
    • 不要搞乱系统时钟。MEncoder使用系统时钟进行A/V同步。如果你调试系统时钟(特别是把时间往后调),MEncoder会产生混乱而你将会丢失帧。这将是一个重要的问题如果你挂在一个网络上并且运行着某种时间同步软件比如NTP,如果你希望可靠的截取,那么在你截取的过程中你必须把NTP关掉。
    • 不要改变outfmt除非你知道你在干什么或者你的芯片/驱动确实不支持默认值(YV12色彩空间)。在老版本的MPlayer/MEncoder 中必须指定输出格式。这个问题在现在的发行版中应该被修正而不再需要指定outfmt,默认值适合大多数应用目的。例如,你用libavcodec把截取的内容编码成DivX并指定outfmt=RGB24希望提高截取图像的质量, 所截取的图像在其后的过程中将重新转换回YV12,所以你获得的唯一效果就是消耗了大量的CPU。
    • 要指定I420色彩空间(outfmt=i420),由于与Intel Indeo video编解码器的fourcc冲突,你必须增加一个选项-vc rawi420
    • 有很多方法可以截取音频。你可以通过用外部电缆线将显卡和声卡的line-in连接起来,用声卡截取音频,或者使用bt878芯片内建的ADC。在后一种情况下,你需要装载btaudio驱动。阅读linux/Documentation/sound/btaudio文件(在内核的源码树中,不是MPlayer的)来了解使用这个驱动的方法。
    • 如果MEncoder无法打开音频设备,确保它们真的可用。可能是声音服务器比如arts(KDE)或者esd(GNOME)的问题。如果你有一块全双工的声卡(现在几乎任何像样的声卡都支持它),而你又在使用KDE,检查声音服务器设置菜单中的"全双工"选项。

    伪输出,到AAlib:)
        mplayer -tv on:driver=dummy:width=640:height=480 -vo aa

    从标准的V4L输入
        mplayer -tv on:driver=v4l:width=640:height=480:outfmt=i420 -vc rawi420 -vo xv

    一个更复杂的例子。它使用MEncoder截取完整的PAL图像,切掉边缘的空白,输出非交错图像使用线性混合算法。音频使用LAME编解码器按固定比特率 64kbps压缩。这个设置适合用来截取电影。
        mencoder -tv on:driver=v4l:width=768:height=576 \
        -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=900 \
        -oac mp3lame -lameopts cbr:br=64 \
        -vf crop=720:544:24:16,pp=lb -o output.avi


    这个加上了重新缩放图像到384x288并把视频用高质量模式压缩到350kbps的比特率。vqmax选项放宽量化器从而允许视频压缩器在牺牲质量的前提下达到如此低的比特率。这可以用来截取长的电视连续剧,在那种用途下视频质量并不非常重要。
        mencoder -tv on:driver=v4l:width=768:height=576 \
        -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350:vhq:vqmax=31:keyint=300 \
        -oac mp3lame -lameopts cbr:br=48 \
        -vf crop=720:540:24:18,pp=tn/lb,scale=384:288 -sws 1 -o output.avi

    也可以在-tv选项中设置一个较小的分辨率而忽略软件缩放选项但是上面的方法使用最大的可用信息而且对噪音更有抵抗力。bt8x8芯片由于硬件的限制只能在水平方向上作点平均。

    编辑决定列表(EDL)系统允许你在播放的时候自动在视频的一部分跳过或者静音,基于一个电影相关的EDL配置文件。

    这对那些想用"家庭友好"模式观赏电影的人有用。你可以根据你个人的设定从一部电影里切掉任何暴力,亵渎,Jar-Jar Binks ..的内容。除了这之外,它还有别的用途,比如自动跳过你正在观看的视频文件中的广告。

    EDL文件的格式相当简陋。当EDL达到一定的成熟度的时候,可能会使用一个基于XML的文件格式(保持对原来的EDL格式的向下兼容)。

    在目前的EDL实现中最大的EDL输入限制为1000。如果你碰巧需要更多,修改edl.h文件中的#define MAX_EDL_ENTRIES

    在你运行MPlayer的时候加上-edl 参数,filename是你希望应用在视频上的EDL文件的文件名。

    目前EDL文件的格式为:

    [begin second] [end second] [action]

    seconds是浮点数而action可以是0代表跳过或者1代表静音。例如:

    5.3   7.1    0
        15    16.7   1
        420   422    0
        

    这将跳过视频的5.3秒到7.1秒的部分,然后在15秒时静音,在16.7秒处取消静音跳过视频的从420秒到422秒的部分。这些动作将在播放计时器达到文件中指定的时间时被执行。

    要创建一个用来工作的EDL文件,使用-edlout 选项,在播放过程中,当你想标记将前两秒跳过时,按i。一个相应的输入将写入文件。你可以回头调整生成的EDL文件。

    MPlayer使用一个复杂playtree格式。它包括写在最前面作为全局设置的选项(例如mplayer -vfm 5),和写在文件名之后,仅仅作用于给定的文件名或者URL或者随便什么的选项(例如mplayer -vfm 5 movie1.avi movie2.avi -vfm 4)。
    你能使用{和}给文件名与URL分组。它对-loop选项很有用:mplayer { 1.avi -loop 2 2.avi } -loop 3命令将按以下顺序播放文件: 1 1 2 1 1 2 1 1 2

       单一文件    mplayer [options] [path/]filename
    多个文件 mplayer [default options] [path/]filename1 [options for filename1] filename2 [options for filename2] ...
    VCD mplayer [options] vcd://trackno [-cdrom-device /dev/cdrom]
    DVD mplayer [options] dvd://titleno [-dvd-device /dev/dvd]
    WWW mplayer [options] (也可以使用playlist)
    RTSP mplayer [options] rtsp://server.example.com/streamName

    最新版本的MPlayer也可以象Xine一样接受URL风格的VCD和DVD轨道: mplayer dvd://1或者mplayer vcd://1

      mplayer -vo x11 /mnt/Films/Contact/contact2.mpg
        mplayer vcd://2
        mplayer -afm 3 /mnt/DVDtrailers/alien4.vob
        mplayer dvd://1 -dvd-device /dev/hdc
        mplayer -abs 65536 -delay -0.4 -nobps ~/movies/test.avi
        

    MPlayer有一个完全可配置的,命令驱动的控制层使你可以键盘,鼠标,游戏杆或遥控器(使用LIRC)控制MPlayer。完整的键盘控制列表参见man page。

    MPlayer允许你使用一个简单的config文件把任何键或按钮绑定为任何一个MPlayer控制命令。句法是键名后加命令。缺省config文件是$HOME/.mplayer/input.conf但是-input conf 选项可以重新指定(相对路径是相对于$HOME/.mplayer的)。

    例子:

    ##
        ## MPlayer input control file
        ##
        RIGHT seek +10
        LEFT seek -10
        - audio_delay 0.100
        + audio_delay -0.100
        q quit
        > pt_step 1
        < pt_step -1
        ENTER pt_step 1 1
        

    运行mplayer -input keylist你将得到一个完整的列表

    键盘:

    • Any printable character
    • SPACE
    • ENTER
    • TAB
    • CTRL
    • BS
    • DEL
    • INS
    • HOME
    • END
    • PGUP
    • PGDWN
    • ESC
    • RIGHT
    • LEFT
    • UP
    • DOWN

    鼠标(只在X下支持):

    • MOUSE_BTN0 (左键)
    • MOUSE_BTN1 (右键)
    • MOUSE_BTN2 (中键)
    • MOUSE_BTN3 (滚轮)
    • MOUSE_BTN4 (滚轮)
    • ...
    • MOUSE_BTN9

    游戏杆(编译时必须打开对游戏杆的支持)

    • JOY_RIGHT or JOY_AXIS0_PLUS
    • JOY_LEFT or JOY_AXIS0_MINUS
    • JOY_UP or JOY_AXIS1_MINUS
    • JOY_DOWN or JOY_AXIS1_PLUS
    • JOY_AXIS2_PLUS
    • JOY_AXIS2_MINUS
    • ....
    • JOY_AXIS9_PLUS
    • JOY_AXIS9_MINUS

    通过运行"mplayer -input cmdlist"你可以得到一个完整的已知命令的列表

    • seek (int) val [(int) type=0]

      搜索电影中的某处
      Type 0 是以+/-val秒搜索。
      Type 1 是以电影的val%搜索

    • audio_delay (float) val

      音频延迟val秒

    • quit

      退出MPlayer

    • pause

      暂停/继续playback

    • grap_frames

      有人知道?

    • pt_step (int) val [(int) force=0]

      选择playtree中的下一个/上一个输入。Val的符号决定方向.
      如果在要求的方向上没有其他可用entry,除非force非0,否则不会做任何动作。

    • pt_up_step (int) val [(int) force=0]

      类似pt_step但它跳转到上一级列表的下一个/上一个。用来跳出playtree的内部循环。

    • alt_src_step (int) val

      当一种以上的source可用时选择下一个/上一个(只有asx播放列表支持).

    • sub_delay (float) val [(int) abs=0]

      字幕延迟+/-val秒或当abs非0时跳到val秒。

    • osd [(int) level=-1]

      切换osd模式或当level>0时把它设为level。

    • volume (int) dir

      增加/减少音量

    • contrast (int) val [(int) abs=0]
    • brightness (int) val [(int) abs=0]
    • hue (int) val [(int) abs=0]
    • saturation (int) val [(int) abs=0]

      设置/调整视频参数。Val范围从-100到100。

    • frame_drop [(int) type=-1]

      切换/设置frame dropping模式。

    • sub_visibility

      切换字幕是否可见。

    • sub_pos (int) val

      调整字幕位置。

    • vobsub_lang

      改变VobSub字幕的语言。

    • vo_fullscreen

      切换到全屏

    • tv_step_channel (int) dir

      选择下一个/上一个tv频道。

    • tv_step_norm

      切换TV制式。

    • tv_step_chanlist

      切换频道列表。

    • gui_loadfile
    • gui_loadsubtitle
    • gui_about
    • gui_play
    • gui_stop
    • gui_playlist
    • gui_preferences
    • gui_skinbrowser

      GUI的行为

    Linux红外遥控 -- 使用一个容易制作的home-brewn红外线接收器,(几乎)任意一个的遥控器然后就可以用它来控制你的Linux box了!更多内容见。

    如果你已安装了lirc-package,configure将自动检测到它。如果一切顺利,MPlayer在启动时将显示 "Setting up lirc support..."之类的信息。如果发生错误它将会显示。如果它不显示关于LIRC的任何信息则对LIRC的支持没有编译。就是这样:-)

    MPlayer的程序名是 -- 嗯,让我想想看 -- ‘mplayer‘。你能使用任何mplayer命令甚至传递超过一种命令只要用\n分开他们。不要忘记当有意义的时候(搜索,音量等等),在.lircrc中开启repeat标记。这是我的.lircrc的摘录:

    begin
        button = VOLUME_PLUS
        prog = mplayer
        config = volume 1
        repeat = 1
        end
        begin
        button = VOLUME_MINUS
        prog = mplayer
        config = volume -1
        repeat = 1
        end
        begin
        button = CD_PLAY
        prog = mplayer
        config = pause
        end
        begin
        button = CD_STOP
        prog = mplayer
        config = seek 0 1\npause
        end
        

    如果你不喜欢lirc-config文件的标准位置(~/.lircrc)使用-lircconf 选项指定别的文件。

    Slave方式把允许你为MPlayer建立简单的frontend。当它开启(用-slave选项)时MPlayer 将从stdin读取用new line(\n)分开的命令。

    MPlayer支持通过HTTP, MMS或者RTSP/RTP协议播放网络上的文件。

    只要直接把URL地址加到命令行中就可以进行播放。MPlayer也支持http_proxy环境变量,并且在可能的情况下使用代理。也可以强行指定使用代理:

    mplayer http_proxy://proxy.micorsops.com:3128/

    MPlayer能从stdin(不称为管道)输入。例如这样能从FTP上播放:

      wget ftp://micorsops.com/something.avi -O - | mplayer -

    注意:当使用网络播放功能时推荐打开cache功能:

      wget ftp://micorsops.com/something.avi -O - | mplayer -cache 8192 -

    4.

    5.

    主要的开发平台是x86上的Linux,尽管MPlayer可以移植到很多别的Linux上。MPlayer的二进制包在很多地方可以获得。但是我们不对任何一个负责,有问题去找这些包的制作者,别找我们。

    为了制作Debian安装包,在MPlayer的代码的目录下面运行下列命令:

        fakeroot debian/rules binary
        

    成为root后你可以像正常情况下一样安装.deb包:

        dpkg -i ../mplayer_0.90-1_i386.deb as root.
        

    Christian Marillat一直在制作非官方的Debian MPlayer, MEncoder和字体的安装包,你可以从他的(apt-get)获得。

    Dominik Mierzejewski制作并维护MPlayer的官方的Red Hat RPM安装包。他制作了播放器,GUI,字体,skin和一些驱动还有编解码器的安装包。所有这些都可以从他的获得。

    Mandrake的安装包可以在获得,SuSE在他们的发行版中包括了一个有缺陷的MPlayer版本。如果你想获得全部的功能,你必须从源代码编译。

    MPlayer可以工作在使用ARM CPU的PDAs例如Sharp Zaurus, Compaq Ipaq上。最简单的获得MPlayer的方法从的安装包服务器下载。如果你像自己编译它,你应该查看OpenZaurus发行版的buildroot下的 目录和。那里总有最新的用来编译一个代libavcodec的CVS的MPlayer的Makfile和补丁。
    如果你需要一个GUI前端,你可以使用xmms-embedded。

    MPlayer可以运行在FreeBSD, OpenBSD, NetBSD, BSD/OS和Darwin上。有ports/pkgsrc/fink等版本的MPlayer可供使用,比直接使用我们的源代码要容易。

    编译MPlayer你需要GNU make(gmake - 本地的BSD的make不能正常工作)和一个比较新的binutils。

    如果MPlayer报告找不到/dev/cdrom或者/dev/dvd,创建一个适当的符号链接:
    ln -s /dev/(your_cdrom_device) /dev/cdrom.

    要在MPlayer中使用Win32 DLLs你需要使用"option USER_LDT"重新编译内核(除非你用的是FreeBSD -CURRENT,其中这一项是默认的)。

    如果你的CPU有SSE,使用"options CPU_ENABLE_SSE"选项重新编译内核来使用它(需要FreeBSD-STABLE,或者使用内核补丁)。

     

    因为gas的版本不同(relocation vs mmx)的限制,你需要分两步编译: 首先确保non-native的汇编程序当前在PATH中并运行gmake -k,然后在确保使用native版本情况下运行gmake

    MPlayer在Solaris 2.6或者更新的系统上应该能够正常运行。

    UltraSPARC上,MPlayer利用他们的VIS扩展(相当于MMX)的优势,目前只应用于libmpeg2libvo以及libavcodec ,但mp3lib没有。你能在400MHz CPU上观看VOB文件。你需要安装。

    为编译它你需要GNU make(gmake,/opt/sfw/gmake),native的Solaris make不能正常工作。你用Solaris的make代替GNU make时的典型的错误信息为:

       % /usr/ccs/bin/make
        make: Fatal error in reader: Makefile, line 25: Unexpected end of line seen
        

    在Solaris SPARC上,你需要GNU C/C++编译器;GNU C/C++编译器是否设置使用GNU汇编程序没有什么关系。

    在Solaris x86上,你需要GNU汇编程序和GNU C/C++编译器,设置使用GNU的汇编程序!在x86平台上的mplayer代码大量使用MMX,SSE和3DNOW!指令集,使用Sun的汇编程序/usr/ccs/bin/as不能编译通过。

    configure脚本将试图查找你的"gcc"命令使用的汇编程序(如果自动检测失败,使用"--as=/wherever/you/have/installed/gnu-as" 选项告诉configure脚本你的系统中GNU的"as"在哪里)。

    在Solaris x86系统上使用没有GNU汇编程序的GCC时configure的出错信息为:

       % configure
        ...
        Checking assembler (/usr/ccs/bin/as) ... , failed
        Please upgrade(downgrade) binutils to 2.10.1...
        

    (解决方法:安装并且使用配置了"--with-as=gas"的gcc)

    当不使用GNU as的GNU C编译程序时的典型出错信息是:

       % gmake
        ...
        gcc -c -Iloader -Ilibvo -O4 -march=i686 -mcpu=i686 -pipe -ffast-math
        -fomit-frame-pointer  -I/usr/local/include   -o mplayer.o mplayer.c
        Assembler: mplayer.c
        "(stdin)", line 3567 : Illegal mnemonic
        "(stdin)", line 3567 : Syntax error
        ... more "Illegal mnemonic" and "Syntax error" errors ...
        

    因为Solaris8 x86的两个bug,不能可靠地播放容量>4GB的DVD:

    • The sd(7D) driver on Solaris 8 x86 driver has bug when accessing a disk block >4GB on a device using a logical blocksize != DEV_BSIZE (i.e. CD-ROM and DVD media). Due to a 32bit int overflow, a disk address modulo 4GB is accessed. ()
    • The similar bug is present in the hsfs(7FS) filesystem code (aka ISO9660), hsfs currently does not support partitions/disks >4GB, all data is accessed modulo 4GB ()

      The hsfs problem can be fixed by installing patch 109764-04 (sparc) / 109765-04 (x86).

    在使用UltraSPARC CPU的Solaris上,对有些耗时的操作使用CPU的VIS指令能获得额外的速度提升。在MPlayer中通过Sun的中的函数使用VIS加速功能。

    mediaLib的VIS加速功能用于mpeg2视频解码和视频输出驱动的颜色转换。

    你可以安装GNU的install程序,并且(如果你没有把它放在你的系统路径中)指定它的位置:

      ./configure --install-path=PATH
        

    或者你可以使用默认的IRIX 6.5提供的install,那你就必须手动修改Makefile文件,把下面两行:

      $(INSTALL) -c -m 644 DOCS/mplayer.1 $(MANDIR)/man1/mplayer.1
        $(INSTALL) -c -m 644 etc/codecs.conf $(CONFDIR)/codecs.conf
        

    改成:

      $(INSTALL) -m 644 mplayer.1 $(MANDIR)/man1/
        $(INSTALL) -m 644 codecs.conf $(CONFDIR)/
        

    然后运行(在MPlayer的源代码目录中):

      cp DOCS/mplayer.1 . ; cp etc/codecs.conf .
        

    然后继续编译和安装。

    能工作。你需要下载SDL for QNX并安装它。然后使用-vo sdl:photon-ao sdl:nto 选项运行MPlayer,速度应该很快。

    -vo x11输出将比Linux更加缓慢,因为QNX只有一个十分缓慢的的X仿真。使用SDL。

    6.6 Cygwin

    Cygwin的移植仍然很不成熟。目前还不支持Win32 DLLs和OpenGL。SDL据说会扭曲声音和图像或者在某些系统上导致崩溃。总是欢迎的。最好的效果是使用本地的DirectX视频输出驱动(-vo directx) 和本地的Windows waveout音频驱动(-ao win32)。你应该查阅邮件列表来获得帮助和最新信息。

    你必须到MPlayer的目录下,拷贝或者symlinketc/cygwin-inttypes.h/usr/include/inttypes.h来使MPlayer顺利编译。

    为了获得本地的DirectX视频,下载,把它们解压到/usr/include/ 或者/usr/local/include/下然后重新编译。如果图像发生扭曲,用-vo directx:noaccel 把硬件加速关掉试试。

    让SDL在Cygwin下工作的方法和文件可以在找到。

    你可以通过播放Windows显示的VCD上的.DAT或者.MPG文件来播放VCD,这样使他工作(改成你的CD-ROM驱动器的盘符):

    mplayer d:/mpegav/avseq01.dat

    mplayer /cygdrive/d/MPEG2/AVSEQ01.MPG

    DVD同样可以,用下面的命令DVD设备设置成你的CD-ROM驱动器:

    mplayer dvd:// -dvd-device ‘\\.\d:‘</FONT></CODE></P> <P>QuickTime DLL据说也能工作。用<CODE><FONT face=新宋体>--enable-qtx-codecs</FONT></CODE>编译并把编解码器放到默认的Windows DLL位置,<CODE><FONT face=新宋体>C:\WINNT\system32</FONT></CODE>或者<CODE><FONT face=新宋体>C:\Windows\system</FONT></CODE>取决于你的Windows的版本。</P> <H1> </H1> <H1></H1> <P>MPlayer有一些公开的邮件列表。除非特别说明否则这些列表的语言是<B>英语</B>。请不要用别的语言或者HTML邮件格式发送消息!一条消息的大小限制是80k。如果你有更大的东西把它放在可以下载的地方。点击链接就可以订阅。在邮件列表上使用与与usenet上相同的书写和引用规则。请遵守他们,它使阅读你的邮件的人的生活轻松的多。如果你不知道请阅读或者(如果你很着急)<A href="~hanb/documents/quotingguide.html"><FONT color=#1848b5>引用HOWTO</FONT></A>。</P> <UL> <LI>MPlayer通告列表:<BR>MPlayer发布通告的邮件列表。如果你想获得新特性的通告在此订阅。 <LI>MPlayer开发者列表:<A href="http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng"><FONT color=#1848b5>http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng</FONT></A><BR> <P>这个列表是关于mplayer开发的! 谈论接口与API的变化,新的库,代码优化,configure修改,另外补丁也应发送到这里。不要在这里发送bug报告,用户问题,特性要求,吵架!这张列表应该保持低流量。</P> <LI>MPlayer用户列表:<BR> <UL> <LI>在这里发送bug报告,(在阅读了<A href="http://www.mplayerhq.hu/DOCS/HTML/zh/documentation.html#known_bugs"><FONT color=#1848b5>已知Bugs</FONT></A>一节和之后) <LI>在这里发送特性要求(在阅读整个文件之后) <LI>在这里发送用户问题(在阅读整个文件之后) </LI></UL> <LI>MPlayer匈牙利用户列表:<BR> <UL> <LI>匈牙利语的列表 <LI>主题?让我们看看...迄今为止主要是吵架和RTFM问题:( </LI></UL> <LI>MPlayer & Matrox G200/G400/G450/G550用户:<BR>在这里发送Matrox相关的问题 <UL> <LI>关于mga_vid的事情 <LI>Matrox的官方的beta版驱动(对于X 4.x.x ) <LI>还有关于matroxfb电视输出的东东。 </LI></UL> <LI>MPlayer & DVB卡用户:<BR>与被称为DVB的硬件译码器卡有关的事情。(不是DXR3!) <P> </P> <LI>MPlayer CVS-log:<BR> <P>在这里只能询问CVS的变化。(如果你不理解为什么要做这样的改动或者你有更好的修正或者你注意到在已经提交的补丁中可能存在的bug或问题)确定你要找的开发者阅读这张列表!</P> <LI>MPlayer Cygwin移植邮件列表:<BR>讨论MPlayer的Cygwin移植的邮件列表。 <LI>MPlayer OS/2移植邮件列表:<BR>讨论MPlayer的OS/2移植的邮件列表。 <LI>MPlayer Weekly News的编辑和翻译的列表:<BR>讨论Weekly News发布的邮件列表。. </LI></UL> <P><B>注意:</B>有可供检索的邮件列表文档。 <H1> -- </H1> <H1></H1> <P>特殊的系统或CPU相关的bug或问题:</P> <UL> <LI>P3上使用2.2.x内核出现SIGILL(signal 4):<BR>问题:2.2.x内核没有适当的(能正常工作的)SSE支持<BR>解决:把内核升级到2.4.x<BR>绕过方法:<CODE><FONT face=新宋体>./configure --disable-sse</FONT></CODE> <LI>一般的SIGILL(signal 4):<BR>问题:你在不同的机器中编译和运行mplayer(例如在P3上编译在Celeron上跑)<BR>解决:在你将使用的的机器上编译MPlayer!<BR>绕过方法:<CODE><FONT face=新宋体>./configure --disable-sse</FONT></CODE>等等选项 <LI>运行MEncoder时出现"Internal buffer inconsistency":<BR>问题:当用gcc 2.96或者3.x编译lame < 3.90时的已知问题。<BR>解决:使用lame > =3.90。<BR>绕过方法:以gcc 2.95.x编译lame并且卸载任何已经安装的lame包,他们可能是用gcc 2.96编译的。 <LI>在PPC上MP2/MP3的声音混乱:<BR>问题:PPC平台上的已知的GCC误编译的bug,目前没有修正。<BR>绕过方法:使用FFmpeg的(较慢的)MP1/MP2/MP3译码器(<CODE><FONT face=新宋体>-ac ffmpeg</FONT></CODE>) <LI>当缩放+编码时,libmpeg2的sig11:<BR>问题: 已知的GCC 2.95.2的MMXbug,升级到2.95.3。 </LI></UL> <P>各种各样A-V同步和其它音频问题:</P> <DIV>一般的音频延迟或者急跳声音(对所有或者大部分文件存在): </DIV> <UL> <LI>最普遍的: buggy的音频驱动! -- 试试使用不同的驱动,用-ao oss试试ALSA 0.9的OSS仿真,也试试-ao sdl,有时它有帮助。如果你的文件用-nosound播放正常,你就能确定这是声卡(驱动)的问题。 <LI>音频缓冲的问题(缓冲大小检测错误)<BR>绕过方法:mplayer -abs选项 <LI>采样率的问题-- 也许你的声卡不支持你的文件使用的采样率 -- 试试 resampling插件(- aop) <LI>机器太慢(CPU或VGA)<BR>用-vo null试试看,如果它播放正常,那么你的VGA显卡/驱动太慢了<BR>绕过方法:买一块更快的显卡或阅读这篇文档关于如何加速的内容<BR>也试试-framedrop </LI></UL> <DIV>特定的某一个或一些文件的音频延迟/不同步: </DIV> <UL> <LI>损坏的文件<BR>绕过方法: <UL> <LI>-ni或-nobps选项(对于非交错的或坏的文件)<BR>以及/或者 <LI>-mc 0(对带有糟糕的交错的VBR音频的文件是需要的)<BR>以及/或者 <LI>-delay选项或者+/-键在播放时调整延迟时间 </LI></UL>如果没有一个方法有效,请upload这些文件,我们将检查(和修正)。 <LI>你的声卡不支持48kHz playback<BR>绕过方法:买个更好的声卡...或者尝试减少10%的fps(对30fps的电影使用-fps 27)或者使用resampler插件 <LI>机器太慢<BR>(如果A-V不是在0附近,状态行的最后一个数字不断增加)<BR>绕过方法:-framedrop </LI></UL> <DIV>完全没有声音: </DIV> <UL> <LI>你的文件使用不支持的音频codec<BR>绕过方法:读取文档并帮助我们添加对它的支持 </LI></UL> <DIV>完全没有图画(全灰/全绿窗口): </DIV> <UL> <LI>你的文件使用不支持的视频codec<BR>绕过方法:读取文档并帮助我们添加对它的支持 <LI>自动选择的codec不能解码文件,试试用-vc或-vfm选项使用其他译码器 <LI>你试图用OpenDivX或XviD(-vc odivx)译码器播放DivX 3.x格式的文件 -- 安装Divx4Linux并且重新编译播放器 </LI></UL> <P>视频输出问题:</P> <P>首先注意: -fs -vm和-zoom选项只是推荐,(目前)不是所有驱动器都支持。因此,如果它不起作用那不是bug。只有少数驱动支持缩放,对x11或dga不要指望这个。</P> <P>OSD与字幕闪烁:<BR>-- x11驱动器: 抱歉,它现在不能被修正<BR>-- xv驱动器: 使用-double选项</P> <P>使用mga_vid时的绿色图象(-vo mga/-vo xmga):<BR>-- mga-vid没有正确检测你的显卡的显存大小,使用mga_ram_size选项重新载入</P> <H1> -- </H1> <H1> -- <A href="http://www.mplayerhq.hu/DOCS/HTML/zh/users_against_developers.html"><FONT color=#1848b5>开发者的眼泪</FONT></A></H1> <H1> -- </H1> </div> <!-- <div class="Blog_con3_1">管理员在2009年8月13日编辑了该文章文章。</div> --> <div class="Blog_con2_1 Blog_con3_2"> <div> <!--<img src="/image/default/tu_8.png">--> <!-- JiaThis Button BEGIN --> <div class="bdsharebuttonbox"><A class=bds_more href="#" data-cmd="more"></A><A class=bds_qzone title=分享到QQ空间 href="#" data-cmd="qzone"></A><A class=bds_tsina title=分享到新浪微博 href="#" data-cmd="tsina"></A><A class=bds_tqq title=分享到腾讯微博 href="#" data-cmd="tqq"></A><A class=bds_renren title=分享到人人网 href="#" data-cmd="renren"></A><A class=bds_weixin title=分享到微信 href="#" data-cmd="weixin"></A></div> <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> <!-- JiaThis Button END --> </div> 阅读(5041) | 评论(0) | 转发(1) | <div class="HT_line3"></div> </div> <div class="Blog_con3_3"> <div><span id='digg_num'>0</span><a href="javascript:void(0)" id='digg' bid='233289' url='/blog/digg.html' ></a></div> <p>上一篇:<a href="/uid-24830003-id-233288.html">i2c总线发送数据和接收数据的驱动分析</a></p> <p>下一篇:<a href="/uid-24830003-id-233290.html">Linux下MPlayer置和使用</a></p> </div> </div> <!-- <div class="Blog_con3_4 Blog_con3_5"> <div class="Blog_tit2 Blog_tit7">热门推荐</div> <ul> <li><a href="" title="" target='blank' ></a></li> </ul> </div> --> </div> </div> <div class="Blog_right1_7" id='replyList'> <div class="Blog_tit3">给主人留下些什么吧!~~</div> <!--暂无内容--> <!-- 评论分页--> <div class="Blog_right1_6 Blog_right1_12"> </div> <!-- 评论分页--> <div class="Blog_right1_10" style="display:none"> <div class="Blog_tit3">评论热议</div> <!--未登录 --> <div class="Blog_right1_8"> <div class="nologin_con1"> 请登录后评论。 <p><a href="http://account.chinaunix.net/login" onclick="link(this)">登录</a> <a href="http://account.chinaunix.net/register?url=http%3a%2f%2fblog.chinaunix.net">注册</a></p> </div> </div> </div> <div style="text-align:center;margin-top:10px;"> <script type="text/javascript" smua="d=p&s=b&u=u3118759&w=960&h=90" src="//www.nkscdn.com/smu0/o.js"></script> </div> </div> </div> </div> <input type='hidden' id='report_url' value='/blog/ViewReport.html' /> <script type="text/javascript"> //测试字符串的长度 一个汉字算2个字节 function mb_strlen(str) { var len=str.length; var totalCount=0; for(var i=0;i<len;i++) { var c = str.charCodeAt(i); if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) { totalCount++; }else{ totalCount+=2; } } return totalCount; } /* var Util = {}; Util.calWbText = function (text, max){ if(max === undefined) max = 500; var cLen=0; var matcher = text.match(/[^\x00-\xff]/g), wlen = (matcher && matcher.length) || 0; //匹配url链接正则 http://*** var pattern = /http:\/\/([\w-]+\.)+[\w-]+(\/*[\w-\.\/\?%&=][^\s^\u4e00-\u9fa5]*)?/gi; //匹配的数据存入数组 var arrPt = new Array(); var i = 0; while((result = pattern.exec(text)) != null){ arrPt[i] = result[0]; i++; } //替换掉原文本中的链接 for(var j = 0;j<arrPt.length;j++){ text = text.replace(arrPt[j],""); } //减掉链接所占的长度 return Math.floor((max*2 - text.length - wlen)/2 - 12*i); }; */ var allowComment = '0'; //举报弹出层 function showJuBao(url, cid){ $.cover(false); asyncbox.open({ id : 'report_thickbox', url : url, title : '举报违规', width : 378, height : 240, scroll : 'no', data : { 'cid' : cid, 'idtype' : 2 , 'blogurl' : window.location.href }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); } $(function(){ //创建管理员删除的弹出层 $('#admin_article_del').click(function(){ $.cover(false); asyncbox.open({ id : 'class_thickbox', html : '<div class="HT_layer3_1"><ul><li class="HT_li1">操作原因:<select class="HT_sel7" id="del_type" name="del_type"><option value="广告文章">广告文章</option><option value="违规内容">违规内容</option><option value="标题不明">标题不明</option><option value="文不对题">文不对题</option></select></li><li class="HT_li1" ><input class="HT_btn4" id="admin_delete" type="button" /></li></ul></div>', title : '选择类型', width : 300, height : 150, scroll : 'no', callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); $('#admin_delete').live('click' , function(){ ///blog/logicdel/id/3480184/url/%252Fblog%252Findex.html.html var type = $('#del_type').val(); var url = '/blog/logicdel/id/233289/url/%252Fuid%252F24830003.html.html'; window.location.href= url + '?type=' + type; }); //顶 js中暂未添加&过滤 $('#digg').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $('#digg').attr('bid'); var url = $('#digg').attr('url'); var digg_str = $.cookie('digg_id'); if(digg_str != null) { var arr= new Array(); //定义一数组 arr = digg_str.split(","); //字符分割 for( i=0 ; i < arr.length ; i++ ) { if(bid == arr[i]) { showErrorMsg('已经赞过该文章', '消息提示'); return false; } } } $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0) { var num = parseInt($('#digg_num').html(),10); num += 1; $('#digg_num').html(num); $('#digg').die(); if(digg_str == null) { $.cookie('digg_id', bid, {expires: 30 , path: '/'}); } else { $.cookie('digg_id', digg_str + ',' + bid, {expires: 30 , path: '/'}); } showSucceedMsg('谢谢' , '消息提示'); } else if(msg.error == 1) { //showErrorMsg(msg.error_content , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } else if(msg.error == 2) { showErrorMsg(msg.error_content , '消息提示'); } } }); }); //举报弹出层 /*$('.box_report').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var url = $('#report_url').val(); var cid = $(this).attr('cid'); $.cover(false); asyncbox.open({ id : 'report_thickbox', url : url, title : '举报违规', width : 378, height : 240, scroll : 'no', data : { 'cid' : cid, 'idtype' : 2 }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); });*/ //评论相关代码 //点击回复显示评论框 $('.Blog_a10').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var tid = $(this).attr('toid');//留言作者id var bid = $(this).attr('bid');//blogid var cid = $(this).attr('cid');//留言id var tname = $(this).attr('tname'); var tpl = '<div class="Blog_right1_9">'; tpl += '<div class="div2">'; tpl += '<textarea name="" cols="" rows="" class="Blog_ar1_1" id="rmsg">文明上网,理性发言...</textarea>'; tpl += '</div>'; tpl += '<div class="div3">'; tpl += '<div class="div3_2"><a href="javascript:void(0);" class="Blog_a11" id="quota_sbumit" url="/Comment/PostComment.html" tid="'+tid+'" bid="'+bid+'" cid="'+cid+'" tname="'+tname+'" ></a><a href="javascript:void(0)" id="qx_comment" class="Blog_a12"></a></div>'; tpl += '<div class="div3_1"><a href="javascript:void(0);" id="mface"><span></span>表情</a></div>'; tpl += '<div class="clear"></div>'; tpl += '</div>'; tpl += '</div>'; $('.z_move_comment').html(''); $(this).parents('.Blog_right1_8').find('.z_move_comment').html(tpl).show(); }); //引用的评论提交 $('#quota_sbumit').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var tid = $(this).attr('tid');//被引用人的id var qid = $(this).attr('cid');//引用的id var url = $(this).attr('url'); var text = $('#rmsg').val(); var tname = $(this).attr('tname'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : tid , 'qid' : qid , 'text': text , 'tname' : tname }, dataType: 'json', success: function(data){ if(data.code == 1){ var tpl = '<div class="Blog_right1_8">'; tpl+= '<div class="Blog_right_img1"><a href="' +data.info.url+ '" >' + data.info.header + '</a></div>'; tpl+= '<div class="Blog_right_font1">'; tpl+= '<p class="Blog_p5"><span><a href="' +data.info.url+ '" >' + data.info.username + '</a></span>' + data.info.dateline + '</p>'; tpl+= '<p class="Blog_p7"><a href="' + data.info.quota.url + '">' + data.info.quota.username + '</a>:'+ data.info.quota.content + '</p>'; tpl+= '<p class="Blog_p8">' + data.info.content + '</p><span class="span_text1"><a href="javascript:void(0);" class="Blog_a10" toid=' + data.info.fuid + ' bid=' + data.info.bid + ' cid=' + data.info.cid + ' tname = ' + data.info.username + ' >回复</a> |  <a class="comment_del_mark" style="cursor:pointer" url="' + data.info.delurl + '" >删除</a> |  <a href="javascript:showJuBao(\'/blog/ViewReport.html\','+data.info.cid+')" class="box_report" cid="' + data.info.cid + '" >举报</a></span></div>'; tpl+= '<div class="z_move_comment" style="display:none"></div>'; tpl+= '<div class="Blog_line1"></div></div>'; $('#replyList .Blog_right1_8:first').before(tpl); $('.z_move_comment').html('').hide(); } else if(data.code == -1){ //showErrorMsg(data.info , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } }, error: function(){//请求出错处理 } }); }); //底部发表评论 $('#submitmsg').click(function(){ if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var bid = $(this).attr('bid'); var toid = $(this).attr('toid'); var text = $('#reply').val(); var url = $(this).attr('url'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : toid ,'text': text}, dataType: 'json', success: function(data){ if(data.code == 1) { var tpl = '<div class="Blog_right1_8">'; tpl += '<div class="Blog_right_img1"><a href="' +data.info.url+ '" >' + data.info.header + '</a></div>'; tpl += '<div class="Blog_right_font1">'; tpl += '<p class="Blog_p5"><span><a href="' +data.info.url+ '" >' + data.info.username + '</a></span>' + data.info.dateline + '</p>'; tpl += '<p class="Blog_p6">' + data.info.content + '</p>'; tpl += '<div class="div1"><a href="javascript:void(0);" class="Blog_a10" toid=' + data.info.fuid + ' bid=' + data.info.bid + ' cid=' + data.info.cid + '>回复</a> |  <a class="comment_del_mark" style="cursor:pointer" url="' + data.info.delurl + '">删除</a> |  <a href="javascript:showJuBao(\'/blog/ViewReport.html\','+data.info.cid+')" class="box_report" cid="' + data.info.cid + '">举报</a></div>'; tpl += '<div class="z_move_comment" style="display:none"></div>'; tpl += '</div><div class="Blog_line1"></div></div>'; $('.Blog_tit3:first').after(tpl); $('#reply').val('文明上网,理性发言...'); } else if(data.code == -1) { showErrorMsg(data.info , '消息提示'); } }, error: function(){//请求出错处理 } }); }); //底部评论重置 $('#reset_comment').click(function(){ $('#reply').val('文明上网,理性发言...'); }); //取消回复 $('#qx_comment').live('click' , function(){ $('.z_move_comment').html('').hide(); }); $('#rmsg, #reply').live({ focus:function(){ if($(this).val() == '文明上网,理性发言...'){ $(this).val(''); } }, blur:function(){ if($(this).val() == ''){ $(this).val('文明上网,理性发言...'); } } }); //删除留言确认 $('.comment_del_mark').live('click' , function(){ var url = $(this).attr('url'); asyncbox.confirm('删除留言','确认', function(action){ if(action == 'ok') { location.href = url; } }); }); //删除时间确认 $('.del_article_id').click(function(){ var delurl = $(this).attr('delurl'); asyncbox.confirm('删除文章','确认', function(action){ if(action == 'ok') { location.href = delurl; } }); }); /* //字数限制 $('#rmsg, #reply').live('keyup', function(){ var id = $(this).attr('id'); var left = Util.calWbText($(this).val(), 500); var eid = '#errmsg'; if(id == 'reply') eid = '#rerrmsg'; if (left >= 0) $(eid).html('您还可以输入<span>' + left + '</span>字'); else $(eid).html('<font color="red">您已超出<span>' + Math.abs(left) + '</span>字 </font>'); }); */ //加载表情 $('#face').qqFace({id : 'facebox1', assign : 'reply', path : '/image/qqface/'}); $('#mface').qqFace({id : 'facebox', assign : 'rmsg', path:'/image/qqface/'}); /* $('#class_one_id').change(function(){ alert(123213); var id = parseInt($(this).val() , 10); if(id == 0) return false; $('.hidden_son_class span').each(function( index , dom ){ if( dom.attr('cid') == id ) { } }); }); */ //转载文章 var turn_url = "/blog/viewClassPart.html"; $('#repost_bar').click(function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var id = $(this).attr('bid'); asyncbox.open({ id : 'turn_class_thickbox', url : turn_url, title : '转载文章', width : 330, height : 131, scroll : 'no', data : { 'id' : id }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); /* //转发文章 $('#repost_bar').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var url = $(this).attr('url'); asyncbox.confirm('转载文章','确认', function(action){ if(action == 'ok'){ $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0){ showSucceedMsg('转发成功!', '消息提示'); }else if(msg.error == 1){ //location.href = '/index.php?r=site/login'; showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); }else{ showErrorMsg(msg.error_content, '消息提示'); } } }); } }); }); */ }); </script> <!--该部分应该放在输出代码块的后面才起作用 --> <script type="text/javascript"> SyntaxHighlighter.autoloader( 'applescript /highlight/scripts/shBrushAppleScript.js', 'actionscript3 as3 /highlight/scripts/shBrushAS3.js', 'bash shell /highlight/scripts/shBrushBash.js', 'coldfusion cf /highlight/scripts/shBrushColdFusion.js', 'cpp c /highlight/scripts/shBrushCpp.js', 'c# c-sharp csharp /highlight/scripts/shBrushCSharp.js', 'css /highlight/scripts/shBrushCss.js', 'delphi pascal /highlight/scripts/shBrushDelphi.js', 'diff patch pas /highlight/scripts/shBrushDiff.js', 'erl erlang /highlight/scripts/shBrushErlang.js', 'groovy /highlight/scripts/shBrushGroovy.js', 'java /highlight/scripts/shBrushJava.js', 'jfx javafx /highlight/scripts/shBrushJavaFX.js', 'js jscript javascript /highlight/scripts/shBrushJScript.js', 'perl pl /highlight/scripts/shBrushPerl.js', 'php /highlight/scripts/shBrushPhp.js', 'text plain /highlight/scripts/shBrushPlain.js', 'py python /highlight/scripts/shBrushPython.js', 'ruby rails ror rb /highlight/scripts/shBrushRuby.js', 'scala /highlight/scripts/shBrushScala.js', 'sql /highlight/scripts/shBrushSql.js', 'vb vbnet /highlight/scripts/shBrushVb.js', 'xml xhtml xslt html /highlight/scripts/shBrushXml.js' ); SyntaxHighlighter.all(); function code_hide(id){ var code = document.getElementById(id).style.display; if(code == 'none'){ document.getElementById(id).style.display = 'block'; }else{ document.getElementById(id).style.display = 'none'; } } </script> <!--回顶部js2011.12.30--> <script language="javascript"> lastScrollY=0; function heartBeat(){ var diffY; if (document.documentElement && document.documentElement.scrollTop) diffY = document.documentElement.scrollTop; else if (document.body) diffY = document.body.scrollTop else {/*Netscape stuff*/} percent=.1*(diffY-lastScrollY); if(percent>0)percent=Math.ceil(percent); else percent=Math.floor(percent); document.getElementById("full").style.top=parseInt(document.getElementById("full").style.top)+percent+"px"; lastScrollY=lastScrollY+percent; if(lastScrollY<200) { document.getElementById("full").style.display="none"; } else { document.getElementById("full").style.display="block"; } } var gkuan=document.body.clientWidth; var ks=(gkuan-960)/2-30; suspendcode="<div id=\"full\" style='right:-30px;POSITION:absolute;TOP:500px;z-index:100;width:26px; height:86px;cursor:pointer;'><a href=\"javascript:void(0)\" onclick=\"window.scrollTo(0,0);\"><img src=\"\/image\/top.png\" /></a></div>" document.write(suspendcode); window.setInterval("heartBeat()",1); </script> <!-- footer --> <div class="Blog_footer" style='clear:both'> <div><a href="http://www.chinaunix.net/about/index.shtml" target="_blank" rel="nofollow">关于我们</a> | <a href="http://www.it168.com/bottomfile/it168.shtml" target="_blank" rel="nofollow">关于IT168</a> | <a href="http://www.chinaunix.net/about/connect.html" target="_blank" rel="nofollow">联系方式</a> | <a href="http://www.chinaunix.net/about/service.html" target="_blank" rel="nofollow">广告合作</a> | <a href="http://www.it168.com//bottomfile/flgw/fl.htm" target="_blank" rel="nofollow">法律声明</a> | <a href="http://account.chinaunix.net/register?url=http%3a%2f%2fblog.chinaunix.net" target="_blank" rel="nofollow">免费注册</a> <p>Copyright 2001-2010 ChinaUnix.net All Rights Reserved 北京皓辰网域网络信息技术有限公司. 版权所有 </p> <div>感谢所有关心和支持过ChinaUnix的朋友们 <p><a href="http://beian.miit.gov.cn/">16024965号-6 </a></p> </div> </div> </div> </div> <script language="javascript"> //全局错误提示弹出框 function showErrorMsg(content, title, url){ var url = url || ''; var title = title || '消息提示'; var html = ''; html += '<div class="HT_layer3_1 HT_layer3_2"><ul><li><p><span class="login_span1"></span>' + content + '</p></li>'; if(url == '' || url.length == 0){ html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick=\'close_windows("error_msg")\'></li>'; } else { html += '<li class="HT_li1"><input type="button" class="login_btn1" onclick="location.href=\'' + url + '\'"></li>'; } html += '</ul></div>'; $.cover(true); asyncbox.open({ id: 'error_msg', title : title, html : html, 'callback' : function(action){ if(action == 'close'){ $.cover(false); } } }); } //全局正确提示 function showSucceedMsg(content, title , url ){ var url = url || ''; var title = title || '消息提示'; var html = ''; html += '<div class="HT_layer3_1 HT_layer3_2"><ul><li><p><span class="login_span2"></span>' + content + '</p></li>'; if(url == '' || url.length == 0){ html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick=\'close_windows("error_msg")\'></li>'; } else { html += '<li class="HT_li1"><input type="button" class="HT_btn2" onclick="location.href=\'' + url + '\'"></li>'; } html += '</ul></div>'; $.cover(true); asyncbox.open({ id: 'error_msg', title : title, html : html, 'callback' : function(action){ if(action == 'close'){ $.cover(false); } } }); } //关闭指定id的窗口 function close_windows(id){ $.cover(false); $.close(id); } //公告 var tID; var tn; // 高度 var nStopTime = 5000; // 不同行间滚动时间隔的时间,值越小,移动越快 var nSpeed = 50; // 滚动时,向上移动一像素间隔的时间,值越小,移动越快 var isMove = true; var nHeight = 25; var nS = 0; var nNewsCount = 3; /** * n 用于表示是否为第一次运行 **/ function moveT(n) { clearTimeout(tID) var noticev2 = document.getElementById("noticev2") nS = nSpeed; // 只在第一次调用时运行,初始化环境(有没有参数) if (n) { // 设置行高 noticev2.style.lineHeight = nHeight + "px"; // 初始化显示位置 tn = 0; // 刚进入时在第一行停止时间 nS = nStopTime; } // 判断鼠标是否指向层 if (isMove) { // 向上移动一像素 tn--; // 如果移动到最下面一行了,则移到顶行 if (Math.abs(tn) == nNewsCount * nHeight) { tn = 0; } // 设置位置 noticev2.style.marginTop = tn + "px"; // 完整显示一行时,停止一段时间 if (tn % nHeight == 0) { nS = nStopTime; } } tID = setTimeout("moveT()", nS); } moveT(1); // 此处可以传入任何参数 </script> <script type="text/javascript"> // var _gaq = _gaq || []; // _gaq.push(['_setAccount', 'UA-20237423-2']); // _gaq.push(['_setDomainName', '.chinaunix.net']); // _gaq.push(['_trackPageview']); // // (function() { // var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; // ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; // var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); // })(); </script> <script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F0ee5e8cdc4d43389b3d1bfd76e83216b' type='text/javascript'%3E%3C/script%3E")); function link(t){ var href= $(t).attr('href'); href+="?url="+encodeURIComponent(location.href); $(t).attr('href',href); //setCookie("returnOutUrl", location.href, 60, "/"); } </script> <script type="text/javascript" src="/js/jquery.qqFace.js"></script> </body> </html>