[OpenBSD]

[索引] [第十二章 - 硬件与特定平台问题] [第十四章 - 配置磁盘]

13 - 多媒体


目录


13.1 - 我怎样配置音频设备?

OpenBSD中有关音频的设备位于 /dev/audio, /dev/sound, /dev/audioctl/dev/mixer。想了解有关音频驱动层的综述请参阅用户手册audio(4)

所有支持的音频驱动已经包含在GENERIC内核中, 所以不需要额外的配置或安装驱动, 想要找出您的音频芯片的的选项, 您必须先知道您的音频芯片类型。被支持的芯片组也许可以在您的平台的硬件兼容页找到。如果您已经开始运行OpenBSD了, 您可以从dmesg(8)命令的输出信息上寻找声卡驱动, 然后阅读它的用户手册获得更多的信息, 比如:可使用的选项还有关于驱动的其他细节。下面的例子是一个dmesg输出的声卡芯片的内容:

auich0 at pci0 dev 31 function 5 "Intel 82801BA AC97" rev 0x04: irq 10, ICH2 AC97
ac97: codec id 0x41445360 (Analog Devices AD1885)
ac97: codec features headphone, Analog Devices Phat Stereo
audio0 at auich0

OpenBSD简要地提供了两个工具用来监视和配置音频设备。 audioctl(1) 用来处理声音参数, 诸如编码、采样率和声道等, 而 mixerctl(1) 用来混合参数, 例如, 声道来源、水平增益和静音。

下面使用命令 audioctl(1) 来显示一个音频设备的默认处理参数。

$ audioctl -f /dev/audio
...  

注意这里的 -f /dev/audio 使用的很明确。打开/dev/audio使这个音频设备按我们的要求重置为默认参数。

audioctl(1) 还可以有效的探测音频设备的能力。例如, 要看这个音频设备是否支持常用的采样率, 您可以简单地尝试各种播放速率:

$ audioctl play.rate=48000
play.rate: -> 48000
$ audioctl play.rate=44100
play.rate: -> 44100
$ audioctl play.rate=22050
audioctl: set failed: Invalid argument
$ audioctl play.rate=8000
audioctl: set failed: Invalid argument
$  

这个设备支持48000 和 44100 Hz 的播放速率, 不支持 22050 或 8000的。 注意如果一个采样率不支持, 系统并非总会返回一个错误信息, 有时候它会返回一个非您所要的采样率, 详见下图:

$ audioctl play.rate=48000
play.rate: -> 48000
$ audioctl play.rate=44100
play.rate: -> 48000
$ audioctl play.rate=22050
play.rate: -> 48000
$ audioctl play.rate=8000
play.rate: -> 48000
$  
这个设备仅支持48000 Hz 的播放速度。

通常声卡多少具备一些简单的混音功能。不带参数地运行 mixerctl(1)将会列出这个设备的混音控制和当前的设定。

$ mixerctl
...  
有些设备只有很少的控制, 有些则有100种或更多的控制。注意, 并非每个音频芯片的所有选项都能输出到外面来。例如, 有可能列出音频选项多于声卡或主板能接受的选项。

有一些选项是很多设备通用的:

每个音频设备的控制选项的命名可能是不同的。例如, 有些音频设备可能没有上面列出的outputs.master选项, 而有一个outputs.outputs选项, 两者的功能是一样的。通常这些控制有一个有含义的命名, 但有时您也需要简单的测试一下不同命名选项的实际效果。

有些设备使用所谓的EAPD, 代表External Amplifier Power Down(外置功率放大器关闭功能), 这实际就是另一个开关。它可能会被认为是"节能", 因为"power down"通常用来表示power saving(节能), 这种类型的控制通常在笔记本电脑上可以找到。有时您需要打开名字中带eapdextamp的选项获得一个输出信号。(译者注:以便确认这些选项的真实含义)

这里有一个通用的mixerctl命令用法的简单例子, 将左右声道的音量设置成200, 但您会出错。

$ mixerctl outputs.master=200, 200
outputs.master: 255, 255 -> 207, 207  
注意这里数值变成207了, 它的原因是这个设备具有一个AC'97编解码器, 它只具有5bit音量控制, 也就是只有32种可能的音量。其它音频设备可能有不同的控制精度。

关闭主声道的静音功能, 您需要这样:

$ mixerctl outputs.master.mute=off
outputs.master.mute: on -> off 

要让更改在每次启动后生效, 编辑 /etc/mixerctl.conf 文件, 例如:

$ cat /etc/mixerctl.conf
outputs.master=200, 200
outputs.master.mute=off
outputs.headphones=160, 160
outputs.headphones.mute=off 

13.2 - 播放不同格式的音频文件

数字化音频

无损音频格式 (AU, PCM, WAV, FLAC, TTA)

一些无损音频格式不需要第三方软件提供它们的非压缩数字样本的字节块就可以播放, 这些格式包括Sun的声音格式(AU), raw PCM文件(headerless, 不包含头部信息的), 和RIFF WAV.

OpenBSD自带一个aucat(1)程序可以录制和播放未经压缩的音频。下面的例子是播放一个WAV文件:

$ aucat -i filename.wav 

aucat(1) 加上-i选项可以支持无头部信息的音频以及WAV文件格式。aucat也可以播放Sun的8KHz单声道mulaw音频文件, 这个格式是Sun的常见的编码格式。

aucat还能将未压缩的音频格式文件直接传送给音频设备来直接播放它。为此, 您需要知道该音频文件的主要参数:编码类型、声道数量、采样率、采样精度。如果您不知道, 您可以用file(1)工具获得这些参数:

$ file music.au
music.au:  Sun/NeXT audio data: 16-bit linear PCM, stereo, 44100 Hz  
$ file music.wav
music.wav: Microsoft RIFF, WAVE audio data, 16 bit, stereo 44100 Hz  

现在剩下需要了解的就是这些示例文件使用的是小端字节序及采用线性量化。您可以通过使用hexdump(1)阅读头部信息判断出来。如果您使用的是一个headerless(raw)文件, 那事先就无法知道参数。参照 audioctl(1) 的使用说明设置下列参数:

play.encoding=slinear_le
play.rate=44100
play.channels=2
play.precision=16 
接下来, 将声音文件发送到音频设备:
$ cat music.au > /dev/sound 
如果您的设定正确, 就会听到预期的声音。

注意:如果您希望保留audioctl设定的参数, 记住, 永远使用 /dev/sound, 而不是 /dev/audio

您也可以使用其它的工具, 例如packages或ports里面的 audio/waveplay , 当然, 流行的软件像XMMS, 除了可以播放其它音频文件外也可以播放这些无损音频文件。

除上面提到的格式外, 还有一些采用无损压缩的音频格式, 例如, Free Lossless Audio Codec(自由的无损音频编码, FLAC)和TTA。FLAC程序已经被移植到OpenBSD上了, 您可能在package和ports的 audio/flac目录下找到。

有损压缩格式 (Ogg Vorbis, MP3, WMA, AAC)

有损压缩的方法经常被应用于音频或其他媒体文件。它的思路是在压缩过程中丢弃大量数据, 但是压缩后的文件在播放时仍具备足够好的效果。它的优点是提供了极高的压缩比从, 而降低了所需的磁盘空间及网络带宽。

有个很好的例子就是自由、开放、非专利的 Ogg Vorbis 格式。播放Ogg Vorbis文件您可以使用ogg123工具, 它已经打包进在 audio/vorbis-tools package中.例如:

$ ogg123 music.ogg
Audio Device:   Sun audio driver output
Playing: music.ogg
Ogg Vorbis stream: 2 channel, 44100 Hz
Time: 00:02.95 [02:21.45] of 02:24.40  (133.1 kbps)  Output Buffer  87.5%  
当然, 许多其它的音频播放软件也有 Ogg Vorbis 插件。

另一个例子是非常著名的 MP3(MPEG-1 Audio Layer 3) 编码, 然而它有共享许可和专利问题。许多工具可以播放 MP3 文件, 您只需阅览packages and ports系统那章有关音频的小节, 然后从里面随便找一个您喜欢的工具就可以了。

那微软专用格式Windows Media Audio (WMA)呢?这种格式的文件您可以通过x11/mplayer播放, mplayer使用 FFmpeg 框架。

一篇非常好的Wikipedia上的文章可以让您更深入了解各种音频文件格式:Audio file formats

合成声音

MIDI

Musical Instrument Digital Interface (乐器数字接口, MIDI) 协议, 是由 MIDI devices 进行处理的。如果您没有一个 MIDI 合成器, 但您想播放一个标准的 MIDI 文件(SMF), 您可以用软件渲染 MIDI 数据, 产生音频文件. 默认情况下, port树里的 audio/timidity 可渲染 MIDI 文件并在音频设备上播放它们。
$ timidity file.mid

MOD

一个Soundtrack module 是一个以有序序列混合音频采样二进制格式, 它可以用非常好的音质播放相当长的数字音乐。

用XMMS软件播放MOD文件可能是在OpenBSD上最简单的办法, 您可以从ports树和packages上找到这个软件。您需要为XMMS安装 -mikmod子程序包以便让它使用MikMod音色库, MikMod音色库支持MOD, S3M, IT 和 XM 模块格式。

您也可以在packages and ports collection那一章的audio小节中发现一系列"trackers", 像tracker, soundtracker, 利用这些trackers您不但可以播放, 还可以生成您自己的模块。然而请注意, ports树中的工具并非支持所有的tracker的格式, 我们永远欢迎您向ports提交一些您自己喜欢的tracker格式的软件。

13.3 - 我在OpenBSD上怎样播放CD?

通过让CD驱动器播放CD然后发送模拟声音到声卡, 或者从音频文件中读取数据然后通过PCI接口发送数字采样到声卡这两种方式全可以播放C。

如果要用CD-ROM驱动器模拟输出的方式播放一张音频CD, 您可以

一个不错的命令行工具被称为 cdio(1), 它包含在基本的系统内。 如果您不加任何参数, 它将进入交互模式。如果您想马上播放, 只需键入命令

$ cdio play

它默认会从第一个CD-ROM驱动器播放, 也就是CD0。注意用户要使用cdio命令必须有访问CD-ROM驱动器权限 (例如 /dev/rcd0c). 因为这个设备默认仅允许root或者操作组成员访问, 为方便起见您可以调整 /etc/group 里面的group这行将特定用户加入操作组, 或者如果您也可以根据需求更改这个设备的相关访问权限。

注意您必须unmute混合器的CD输入。 就像输出一样, 每个系统的实际输入名称有很大的区别, 但是您可以使用像这样的命令:

$ mixerctl inputs.cd.mute=off  

还有一种可能是在您的CD驱动器和音频设备之间没有模拟音频连接, 这种情况下您可以用cdio的cdplay命令通过PCI总线将CD音频数据发送到声卡。

$ cdio cdplay

如果您喜欢一个漂亮的GUI, 在packages和ports中有大量基于X11的CD播放器。您仅需在音频相关小节中找一个。

13.4 - 我能用OpenBSD录音吗?

可以, 大多数设备支持录音功能, OpenBSD自带的 aucat(1) 可以提供此功能。
$ aucat -o file.wav
上面的命令将录制一个WAV格式的声音文件。按下[CTRL]-C 可以终止录音。 这个文件采用16-bit、44.1Hz 立体声采样, 您也可以用其它的采样格式、采样率和声道数。详细请参阅用户手册。

用aucat回放录制的声音文件:

$ aucat -i file.wav 

如果录制过程看起来正常, 但是回放没有声音或有问题, 那混合器可能需要进行一些设置, 确认您使用了正确的设备进行了录制, 并且关闭了声源的静音功能。 您可以用 mixerctl(1) 设置需要的参数, 例如:

inputs.mic.mute=off
inputs.mic.preamp=on
inputs.mic.source=mic0
record.source=mic
record.volume=255, 255
record.volume.mute=off
record.mic=255
record.mic.mute=off 

这些是针对从麦克风录制的设置, 已经开启了预防大, 否则可能在某些系统上录制的音量会很低。但是开启了预防大也可能导致在某些系统上音量过大。

13.5 - 我怎样设置一个音频服务器?

我是否需要一个音频服务器?

aucat(1) 工具可以充当一个音频服务器, 做为audio(4)驱动和音频应用程序的中间环节。 它的目标是: 如果你的应用程序兼容于你的硬件并且你不打算同时使用多个应用程序, 那么你不需要一个音频服务器。

我怎样设置aucat(1)?

aucat没有配置文件, 并且多数情况下你不需要调整它。键入:
$ aucat -l

会在默认音频设备(也就是 /dev/audio 符号链接指向的设备)上启动这个服务器并运行在44.1kHz以及双声道(stereo)。 这意味着这个应用程序在44.1kHz立体声时有最佳的使用状况, 意即不需转换。 如果这个设备不支持这个参数, aucat(1) 会自动选择另一套参数。

如果你有一定的权限, 你可以提升aucat的权限以减小缓冲区过载或欠载的概率,例如:

$ sudo renice -n -20 `pgrep -x aucat`
注意aucat(1)默认以全双工模式启动, 这要求你的设备支持全双工模式,若非如此, 你只有以 in play-only 或 record-only 模式启动aucat(1), 例如:
$ aucat -l -m play

我怎样在系统启动时启动aucat(1)?

如果你是电脑本地的唯一用户, 你可以在rc.local(8)定义让aucat(1)随系统启动:
nice -n -20 su -m mylogin aucat -l
aucat(1)程序不能同时被多个用户共享。

我还需要设置多少延迟?

延迟是程序播放音频和用户听到此音频的时间差。 因为声音数据总是被缓冲的, 这个延迟与缓存区的大小成正比。 下面是推荐参数: 音频缓冲越小 (获得更少的延迟), 过载或欠载的几率越大。 缓冲过载或欠载回事声音听起来像"口吃"。

在服务器模式下, aucat(1)在所有的音频应用程序上规定了最小的延迟, 而默认延迟大约为250ms. 如果你想减小应用程序的延迟, 使用"-b"选项来挑选你希望的延迟 (用帧数表示)。 例如, 在 44100 samples/second, 50ms 延迟对应为:

44100 samples/second x 0.050 seconds = 2205 samples
然后向下面这样运行aucat(1):
$ aucat -b 2205 -l

是否低延迟对音视频同步有利?

同步音视频不需要低延迟。 不同步的问题往往是因为软件自身引起的(运行地不好, bugs, ...),强制让软件使用小缓冲 (以小延迟模式启动aucat(1)) 可能会掩盖软件某些情况下的实际问题,从而错误地感觉这个软件运行得比以前好了,但是很显然, 赶紧查找此软件的相应bug才是正确方向。

13.6 - 音频设备有问题, 我该怎么办?

播放音频时如果听不到声音, 有可能是混合器控制设置得过低或没有关闭静音功能。 参阅这一小段 13.1 - 我怎样配置音频设备 以配置您的混合器。在报告程序错误前先关闭(unmute)所有的输入输出的静音功能。

如果声音失真, 那可能是您的声卡仅支持一种或有限的几种采样率, 参阅这一小段 13.1 - 我怎样配置音频设备 来确认您的音频设备支持什么样的参数设定。

如果您的音频设备仅支持少量的采样率, 请在packages或ports中选择相关的应用程序按相关的采样律进行播放。它们可以让您用不同的采样率进行播放音频文件。例如 x11/mplayer有一个"-srate"开关可以指定输出一个您期望的采样率, 您可以设定为您的音频设备支持的采样率。 KDE的artsd及一些游戏也有同样的选项。请阅读这些音频程序的说明文档以确认它是否支持重采样率。

重采样率可以通过aucat来实现., 例如:

$ mpg321 -s file.mp3 | aucat -r 22050 -i - 
上面的命令使用mpg321aucat命令已22050Hz的重采样率播放MP3音频文件。

如果您还有问题, 下面有些事情您需要考虑:

如果您确认您的设备没故障, 但是它就是不能正常工作, 那现在正是做一下调试的时候。下面这些步骤检测是否DAC可以处理数据。

$ cat > /dev/audio < /dev/zero & 
[1] 9926
$ audioctl play.{seek, samples, errors}
play.seek=48000
play.samples=3312000
play.errors=0
$ audioctl play.{seek, samples, errors}
play.seek=57600
play.samples=7065600
play.errors=0
$ audioctl play.{seek, samples, errors}
play.seek=48000
play.samples=9379200
play.errors=0
$ kill %1
$ fg %1
cat > /dev/audio < /dev/zero
Terminated  

这里我们可以看到我们每次检查时处理的数据计数play.samples全在增长, 也看见了play.seek表示音频设备具有足够的缓存, 同时play.error也总是0, 表示没有数据被丢弃。

这里注意即使您在测试时插入一个话筒您也不会听到任何声音, 因为这个测试仅向设备不断发送数据0, 它对当前所有默认编码来说是无声的。

因此我们知道音频设备可以处理数据, 再次检查混合器是一个不错的想法, 确认是否所有的输入输出全关闭了静音功能并且设置了一个合适的水平。

如果这时您还有问题, 那就需要您发送一份 错误报告 了, 除了正常错误报告所需资料(诸如全部的dmesg和发生错误时详细情况)外, 您还需要包括一个默认的mixerctl -v输出以及上述测试DAC过程的输出信息。

13.7 - 我如何使用MIDI工具?

乐器数字接口(MIDI)协议提供了一个标准和有效的手段以电子数据表现音乐演奏信息。 一个MIDI数据仅包含了合成器演奏音频所需的信息, 而不是音频。更多信息请参阅Tutorial on MIDI and Music Synthesis

播放MIDI数据, 一个合成器必须连接到计算机的MIDI端口, 录制 MIDI 数据必须有一个MIDI工具(例如, 一个MIDI 键盘). 有些声卡包含了内嵌的MIDI合成器, 它附在MIDI端口上。高段的MIDI工具可能包含了多个部件 (合成器、键盘、控制面板...), 它们在OpenBSD里显示为多个MIDI端口。

当您运行一个OpenBSD系统时, 可以在dmesg(8)输出内找到MIDI端口, 例如:

midi0 at pcppi0: <PC speaker>
umidi0 at uhub2 port 2 configuration 1 interface 0 "Roland Roland XV-2020" rev 1.10/1.00 addr 2
midi1 at umidi0: <USB MIDI I/F>
umidi1 at uhub1 port 2 configuration 1 interface 1 "Evolution Electronics Ltd. USB Keystation 61es" rev 1.00/1.25 addr 3
midi2 at umidi1: <USB MIDI I/F>
它显示了三个MIDI端口, 分别对应于: 测试您的MIDI键盘, 您可以使用hexdump(1)工具来显示您在它上面播放的MIDI数据:
$ hexdump -e '1/1 "%02x\n"' </dev/rmidi2
90
3c
71
... 
键盘的输出可以连接到合成器的输入, 用如下命令:
$ cat -u /dev/rmidi1 >/dev/rmidi2
现在您可以在合成器上听见您在键盘上的弹奏。 实际上您弹奏的音乐是捕捉自 /dev/rmidi1 然后实时发送至 /dev/rmidi2 。更多的信息请参看 midi(4) 的用户手册。

播放标准MIDI文件的主要工具是 midiplay(1)。通过合成器播放一个标准的 MIDI 文件, 很简单:

$ midiplay -d 1 file.mid
注意我们使用参数 1 来指定的MIDI设备(也就是 /dev/rmidi1) , 因为默认情况下 0 号设备已经被使用了。

如果您要录制 MIDI 文件, 您可以使用捆绑在audio/midish port中的smfrec 工具, 例如:

$ smfrec -d /dev/rmidi1 -i /dev/rmidi2 file.mid 

将会录制键盘(/dev/rmidi2)正在演奏的内容并实时发送给合成器(/dev/rmidi1), 所以您可以听到您正在弹奏的内容。 更复杂的操作像编辑、路径、混合、转换MIDI数据的工作可以用绑定在audio/midish port中的rmidish工具来实现。

13.8 - 请告诉我什么是Ogg Vorbis和MP3编码?

这些格式已经在前面 播放不同格式的音频文件 中提到过了。这小节我们将简要介绍此类文件的编码。 如果您又兴趣学习如何进行压缩编码, 更多的信息请参阅Wikipedia中有关 Vorbis MP3 的文章。

Ogg Vorbis

可以使用oggenc 工具可以将 raw, WAV 或者 AIFF 格式压缩成 Ogg Vorbis 格式, 它包含在package的audio/vorbis-tools , 您可以通过OpenBSD的packages和ports系统获得。

假设您刚把您喜欢的专辑从CD上提取出来, 您想把这些提取的 WAV 文件压缩成大致192 kbps的采样率, 您可以像这样运行命令:

$ oggenc *.wav -b 192
完成时会在当前目录下生成一些列 .ogg 文件。oggenc的用户手册上有更多编码参数的说明和更详尽的例子。

MPEG-1 Audio Layer 3 (MP3)

如果您想将这些文件编码成 MP3 格式, 您可以使用 "Lame ain't an MP3 encoder" (LAME), 它是一个学习 MP3 编码的教育软件。 Lame已经包含在OpenBSD的ports树中。注意因为MP3的专利您在官方的发行版里找不到这个软件。

下面的例子将一个WAV文件编码成192 kbps的MP3文件:

$ lame -b 192 track01.wav track01.mp3

更多的选项和说明请参阅Lame附带的说明文档。

13.9 - 如何在OpenBSD中播放DVD视频?

OpenBSD支持标准的ISO 9660文件系统的DVD光盘, 这种文件系统也用于CD-ROMs, 并且从OpenBSD 3.8开始, 也支持一些DVD上使用的Universal Disk Format (UDF)文件系统格式。然而, 几乎所有DVD-Video 和 DVD-ROM磁盘采用的全是UDF bridge格式, 它结合了DVD MicroUDF(采用UDF 1.02的子集)和ISO 9660文件系统的特点, 主要是考虑了向后的兼容性。

因为多数计算机有一个DVD-ROM驱动器并使用软件进行解码, 所以您至少使用一个350-MHz Pentium II或性能相当的CPU才可能流畅地播放。

一些流行的媒体播放器已经为OpenBSD提供了ports, 例如: ogle, mplayer, xine 和 kaffeine。因为这些软件可能需要进一步的设置, 所以请阅这些软件包的安装说明。有了这些工具就可以在DVD播放时直接访问原始设备, 当然您也可以用mount_cd9660(8)先mount一个DVD, 然后在这个或其它的已经挂载的文件系统上播放这些文件。

说明:

13.10 - 如何刻录CD和DVD?

13.10.1 - 介绍和基本设置

您首先要确认您的刻录机已经被内核识别并配置了。OpenBSD支持多数SCSI设备, IDE/ATAPI 和 USB设备可以通过SCSI模拟进行支持, 您能很快的在您的 dmesg(8) 输出信息上找到, 您只需要找以 "CD" 开头的那些行, 例如:

cd0 at scsibus0 targ 0 lun 0: <TOSHIBA, CD-ROM XM-5702B, 2826> SCSI0 5/cdrom removable
cd1 at scsibus1 targ 4 lun 0: <PLEXTOR, CD-R PX-R412C, 1.04> SCSI2 5/cdrom removable 

但是cdrecord -scanbus命令无效!

是的, 与使用上述命令的OS不同, OpenBSD使用了不同的命名空间。就像上面已经提过的, 所有的已配置设备全可以在dmesg输出文件中找到。您需要的信息也在那里。

Error: mount_cd9660: /dev/cd2c on /mnt/cdrom: No such file or directory

默认情况下, OpenBSD安装程序仅提供两个CD设备节点, cd0cd1。要使用您的cd2设备, 您必须为它创建所需的设备节点。 我们推荐使用 MAKEDEV(8) (根据您的平台) 脚本来创建您的设备节点:
# cd /dev
# ./MAKEDEV cd2

下面的内容, 我们几乎全是通过裸设备(raw character device)访问CD/DVD刻录机, 而非块设备(block device)

(译者注:块设备传输数据可以使用缓存以提高I/O传送速度, 数据缓存在内存中的buffer, 直到存满, 然后开始向磁盘些数据;裸设备每次仅传送少量的数据, 数据直接传送到磁盘, 而不使用系统I/O缓存。 )

 

检查 CD/DVD 刻录机操作

我们推荐检查您的CD/DVD刻录机是否工作正常。这个例子中我们使用USB 2.0接口的DVD刻录机:

cd2 at scsibus2 targ 1 lun 0: <LITE-ON, DVDRW LDW-851S, GS0C> SCSI0 5/cdrom removable  

想要使用它先将一张已经刻录好的CD/DVD放进去并挂载, 如果您喜欢, 您还可以测试一下从CD/DVD上拷贝文件到硬盘的传输速率, 使用time(1)命令可以帮助您。

如果这时什么事情不对头或者您得到了一些错误信息, 明知的话您需要先修复错误, 不要先着急刻录您的CD/DVD。

我现在想刻录一张CD! 可以开始了吗?

在您开始前, 请记住这些非常好的忠告:

13.10.2 - 刻录CD

刻录一张数据CD-ROM

首先您需要为CD-ROM创建一个ISO 9660文件系统, 您需要使用基本系统包含的 mkhybrid(8) 工具, 或者package中的mkisofs工具, mkisofs在刻录目录树很多的CD时会更好些。西面这个例子中我们使用mkhybrid, 它和mkisofs的用法类似。

作为例子, 我们假设需要将OpenBSD内核源代码存成一个ISO 9660镜像:

$ mkhybrid -R -o sys.iso /usr/src/sys
Using ALTQ_RMC.000;1 for  /usr/src/sys/altq/altq_rmclass_debug.h (altq_rmclass.h)
...
Using IEEE8021.00H;1 for  /usr/src/sys/net80211/ieee80211_amrr.c (ieee80211.c)
 10.89% done, estimate finish Sat Nov  3 08:01:23 2007
 21.78% done, estimate finish Sat Nov  3 08:01:28 2007
...
 87.12% done, estimate finish Sat Nov  3 08:01:31 2007
 98.01% done, estimate finish Sat Nov  3 08:01:32 2007
Total translation table size: 0
Total rockridge attributes bytes: 896209
Total directory bytes: 2586624
Path table size(bytes): 11886
Max brk space used 0
45919 extents written (89 Mb)

这里的 -R 选项告诉 mkhybrid 在ISO 9660 镜像里产生Rock Ridge扩展。产生Rock Ridge交换协议以便在ISO 9660文件系统内提供POSIX文件系统语义的支持, 诸如长文件名、文件所有者、权限、文件链接、软链接、设备节点、更深的文件层次(支持8层子目录)等。

同样如果您想让您CD-ROM上的长文件名文件在Windows或DOS内可读, 您应该增加 -J 标记(参数)以便在ISO 9660镜像里包含Joliet扩展。

创建完文件系统, 您可以通过挂载这个ISO 9660 镜像 来校验它。如果没有错误, 您现在就可以准备刻录到CD-R(W)上了。最简单的方法是使用 cdio(1) 工具。

如果您使用可复写光盘例如CD-RW, 您需要在刻录前先清空它。

# cdio -f cd1c blank
您现在就可以将上面例子中产生的光盘镜像刻录在一张空的CD-R(W)上了, 您可以用类似这样的命令:
# cdio -f cd1c tao sys.iso
我们用上面的选项指定cdio使用第二个CD-ROM驱动器做为CD刻录机。

要校验这张CD-ROM是否正确无误, 您可以先挂载它然后检查是否所有数据全在那里。挂载这个文件系统, 您应该为这个CD-ROM驱动器使用块设备, 这个例子中我们仍然是用这台CD刻录机:

# mount /dev/cd1c /mnt/cdrom

制作音频CD

刻录音频CD, 您可以再次使用 cdio(1) 工具并加上 tao -a 选项。

例如, 我想为我的音乐CD制作一个备份拷贝。这个过程包含两个步骤:

  1. 获得原始CD的音轨, 例如:
    # cdio -f cd1c cdrip
    
    这个命令将从第二个光驱内的音频CD上的提取一系列WAV文件到您的磁盘。
  2. 将音轨文件写入一张空白CD。例如:
    # cdio -f cd1c tao -a *.wav
    

13.10.3 - 刻录DVD

您在刻录自己的DVD前有些重要的事情您必须提前了解。

重要说明:

不同的DVD格式

有一些列不同的DVD格式。广泛使用的是DVD-R, DVD-RW, DVD+R 和 DVD+RW(R代表可以写一次, RW代表可以复写数千次)。这是几个差异很大的标准。

还有一个非常不同的格式是 DVD-RAM, 它主要被发展作为数据存储, 可以使用先进的数据包写入功能, 这一功能允许 DVD-RAM 像一种光学磁盘那样被使用。但是 DVD-RAM 并不被推荐使用于视频用途, 因为写入的视频格式与常用的DVD播放机不兼容。

一个重要的事情是您使用的媒体适合您的DVD刻录机, 但是如果您想让它兼容于其它的DVD播放机, 那处处要小心谨慎, 并确保您阅读了DVD FAQ的这一小节

DVD 刻录速度

可能有必要在这里说明一下DVD的速度表示不同于CD-ROM的速度表示。 下表提供了一个概述:

DVD 读/写速度 传输速率(MB/s) 等效于CD-R(W) 读/写速度
1x 1.32 9x
2x 2.64 18x
4x 5.28 36x
8x 10.57 72x

您可以从上表中看出来, 传输速率是相当高的, 然后您需要检查一下是否您的总线(SCSI, (E)IDE/ATAPI, USB)可以处理这个数据吞吐量。尤其是老的USB 1.0和1.1接口工作在一个很低的传输速率上, 最大的传输速率分别是1.5 Mbit/s 和 12 Mbit/s, 这意味着USB 1.0的最大吞吐量是178.8 kByte/s, 而USB 1.1的最大吞吐量是1.43 MB/s。USB 2.0则快很多:480 Mbit/s 或 57.2 MB/s 。通常情况下SCSI 和 (E)IDE 或ATAPI buses的传输速率全很好。

刻录 DVD

基本上和刻录CD-R(W)很相似。但是使用的软件不相同。刻录DVD最好的工具是sysutils/dvd+rw-tools里的 growisof 。 这个工具可以将一个ISO 9660镜像写入DVD介质。dvd+rw-tools支持所有recordable的DVD格式。

如果您想得到DVD刻录机中光盘的更多信息(例如, 您遗失了光盘盒上的标签, 或者像我一样就是认不出来了), 您可以使用dvd+rw-mediainfo工具。

刻录DVD有两个选择:

我先用包含在 /cvs 目录下的CVS模块 (src, XF4, ports 和 www) 生成一个ISO 9660镜像。我使用下面的命令, 这个命令很像上面生成CD-ROM 镜像的命令。

$ mkisofs -R -o cvs.iso /cvs
如果一切顺利, 挂载这个镜像检查ISO 9660文件系统。 将这个镜像文件(约2G)写入一张空白的DVD光盘, 这里可以用:
# growisofs -dvd-compat -Z /dev/rcd2c=cvs.iso
Executing 'builtin_dd if=cvs.iso of=/dev/rcd2c obs=32k seek=0'
/dev/rcd2c: pre-formatting blank DVD+RW...
/dev/rcd2c: "Current Write Speed" is 4.1x1385KBps.
  23822336/1545832448 ( 1.5%) @3.9x, remaining 5:19
  42172416/1545832448 ( 2.7%) @3.9x, remaining 5:20
  60522496/1545832448 ( 3.9%) @3.9x, remaining 4:54
...
1504706560/1545832448 (97.3%) @3.9x, remaining 0:07
1523318784/1545832448 (98.5%) @3.9x, remaining 0:04
1541898240/1545832448 (99.7%) @3.9x, remaining 0:00
/dev/rcd2c: flushing cache
/dev/rcd2c: writing lead-out
/dev/rcd2c: reloading tray

这个 -Z 选项告诉growisofs对设备写入一个初始会话, 我这里的是写入cd2。这个 -dvd-compat 选项是关闭光盘, 它的意思是不允许写入更多的会话。这将更好的兼容视频DVD播放器和一些老式的DVD-ROM光驱。

注意 growisofs 是怎样指定写入速度的, 这个例子中是3.9x的DVD速度, 正如dvd+rw-mediainfo显示的那样, 它是由DVD光盘和刻录机的能力确定的。

如果您的磁盘空间不足, 不用在磁盘上写入一个ISO 9660镜像文件, 您可以将您的数据直接写入磁盘。我们先预演一下, 模拟建立这个文件系统。

# growisofs -dry-run -Z /dev/rcd2c -R /cvs
如果这个过程成功, 我们仅需要去掉 -dry-run 选项并开始刻录DVD。
# growisofs -Z /dev/rcd2c -R /cvs

也可以使用 -M 选项在一个已有数据的DVD上追加数据, -M 参数的作用是将一个新的会话合并到已有的数据的DVD上:

# growisofs -M /dev/rcd2c -R /mydata
更多关于 growisofs 的信息, 请浏览它的用户手册。

当刻录完成时, 挂载它并确认是否所有数据已经写入。

为什么我不能以我希望的速度刻录?

您看到的输出信息可能与上例中不同, 也许看着像这样:
   4784128/1545832448 ( 0.3%) @0.7x, remaining 26:50
   7929856/1545832448 ( 0.5%) @0.7x, remaining 29:05
  14123008/1545832448 ( 0.9%) @0.7x, remaining 27:06
...

是很慢的速度。它说明不知什么原因您没有从刻录机使用的计算机总线上获得足够的吞吐量。上例中, DVD刻录机通过USB接口连接到计算机上, 刻录机使用USB 2.0的 ehci(4) 驱动未能正确的初始化, 我们一如既往地欢迎您提供程序补丁和测试结果。这里DVD刻录机退回至较慢的USB1.1的接口速度, 因此导致吞吐量的降低。事实上, 即使是USB1.1的接口速度限制为12 Mbit/s, 差不多是1.43 MB/s或1.08x的DVD速度, 为减少缓冲区欠载的危险, 这个DVD刻录机将速度将低于最大值。

13.11 - 但我想使用FOO格式的媒体文件

不同音频格式之间的转换

我们假设想要从 FAQ 13 - 音频录制 将处理录制的声音。录制的声音保存为raw格式。这样在转换时很有好处。因为raw格式不包含头文件并且可以设定成各种所需的参数。

一个音频转换工具是audio/sox, 可以从packages或ports上得到。sox支持AIFF, AU, MP3, Ogg Vorbis, RIFF WAV 以及 raw 格式, 还有其它一些奇特的格式。下例中我们将录音转换为RIFF WAV格式:

$ sox -U -c 1 -r 8000 -b myvoice.raw myvoice.wav

注意这里的指定参数对应录音时的指定参数。这仅是一个例子, 有更多的与音频相关的库文件和软件可用于音频转换。

说明:不推荐有损压缩格式之间的格式转换。例如, MP3和Vorbis在编码时丢弃了不同的原始声音波形。因此当您将MP3格式转换为Ogg Vorbis格式时您可能会得到比原始的MP3文件更差的音质。

不同视频格式间的转换

了解下面视频格式之间的区别很重要

目前在OpenBSD中MPEG和AVI的容器文件格式已经非常成熟了。但是ports中还没有工具可用来制作流媒体格式的MP4.

两个最常用的工具是multimedia/transcodemencoder (x11/mplayer的一部分), 它们全可以调用graphics/ffmpeglibavcodec 库文件以便产生极好的输出质量。当然您也可以直接使用 ffmpeg 。您还可以使用multimedia/xvidcore下的Xvid编码器。

这些软件包的说明文档可以在各自的用户手册或 /usr/local/share/doc 里找到, 它们包含了很多实例, 所以我们强烈推荐您阅读这些文档。

13.12 - 我能在OpenBSD中播放播放流媒体吗?

是的, 在一些平台上完全可以正常的播放大多数音频或视频的流媒体文件, 但是还有一部分流媒体文件无法播放。

这里并非意味着在任何平台上都可以播放所有格式的流媒体文件。您可能先需要了解有关流媒体知识。一个虽有些过时但很好的参考是 O'Reilly book 出版的Designing Web Audio中chapter about streaming media

首先需要明白的是有一系列流媒体协议。流媒体协议定义了流媒体怎样在通过网络传输。这些协议可以有效的在互联网上实时传送音/视频。大多数流媒体协议是应用协议(工作在internet的第7层), 它可以使用UDP或TCP(第四层)传输协议。 User Datagram Protocol(UDP, 用户数据报协议)非常适合这种类型的应用, 因为它不会重新发送数据也没有其余的开销。一些有专利的专用协议也被开发出来, 例如微软的MMS, Real的RTSP.正如我们将看到的那样, HTTP(使用TCP)有时也同样使用, 尽管它不像UDP, RTSP和MMS那样可以提供一个稳定比特率。

接下来, 我们讨论一下流媒体的格式, 它是如何组织音/视频数据使它们可以被播放的, 最广泛使用的流媒体格式是MP3, Real Audio(RA, RM)和Windows Media(ASF), 这些全包含专利技术。偶尔您也会遇到开放的Ogg Vorbis流媒体。

作为例子, 我将分几步解释怎样在网络上收听比利时国家广播电台。OpenBSD中因为没有浏览器嵌入式插件, 所以收听这些新闻报道并非通常简单地点击一下鼠标就马上可以了。

Windows Media(asf)流媒体通常也可以播放, 尽管它的数据必须通过 graphics/win32-codecs port提供支持, 这个win32-codecs只能运行在i386平台(用'pkg_info win32-codecs' 命令会告诉您包含的codecs)。一些Real的音频流可以在i386平台上通过mplayer配合graphics/win32-codecsemulators/fedora/base 这两个port来进行播放。(参考邮件列表上的这个思路)

13.13 - 我的浏览器可以使用Java插件吗?(仅i386/amd64)

Java 插件是Java开发工具包(JDK)的一部分。因为许可证的原因, OpenBSD无法向用户直接提供编译好的JDK二进制packages 。这意味着您需要自己从ports里编译它。更多关于构建JDK的信息可以在FAQ 8 - 编程语言内找到。 一旦您完成了JDK的构建, 您就可以完全安装JDK程序包或者只安装Java执行环境(JRE, 也称作Java虚拟机), 这个虚拟机是一个子安装包, 并且包含了浏览器插件。

在安装时, 会提示安装 Firefox 或 Seamonkey的浏览器Java插件, 根据解释创建符号链接, 然后在浏览器地址栏里键入 "about:plugins"您就看见Java插件了。

对KDE的Konqueror浏览器来说, 或者Java的二进制文件必须包含在您的PATH, 或者在菜单中配置它的绝对路径——menu Settings -> Configure Konqueror -> Java & JavaScript。默认情况下, Java二进制文件位于/usr/local/jre-version/bin//usr/local/jdk-version/bin/ 目录内, 取决于您安装的是JRE还是JDK。

说明: 我们对Java支持的测试仅限于Firefox, Seamonkey 以及 Konqueror 浏览器。如果您在其它不同的浏览器上可以正常的工作, 请告诉我们。

13.14 - 我的浏览器可以使用Flash插件吗?(仅i386)

Flash插件是Adobe公司以二进制格式发放的, Adobe并未提供OpenBSD本地的flash 插件, 但是提供了一个linux插件, 您可以在linux模拟环境下使用它。这个插件仅在i386平台下有效。

继续之前, 您应该先阅读一下兼容linux(8)中有关Linux模拟的说明以及FAQ 9 - 在OpenBSD中运行Linux程序包

如果您已经熟悉了这些, 并且您还未安装任何所需文件, 那您只需简单地添加fedora package。我们假设您已经设置了PKG_PATH 环境变量 (参阅FAQ 15),

# pkg_add -i fedora_base
这个命令会自动设定 kern.emul.linux=1, 但并非永远更改了这个设定值。 如果您需要默认执行Linux模拟, 您需要在 /etc/sysctl.conf文件里指定, 在 FAQ 9 - 在OpenBSD中运行Linux程序包里有解释。

另一个您应该知道的是Linux共享库和模块不能在OpenBSD下运行, 所以您同时需要一个Linux的浏览器。

还有一个候选的Opera浏览器, 也可以从ports上得到, 我们没有为它再分发package, 因为Opera的使用许可在再分发问题上模棱两可。但是安装port也花不了多少时间, 因为Opera提供了二进制文件。安装完Opera后您可以轻松地从ports树里安装Flash插件。

# cd /usr/ports/www/opera
# make install
# cd /usr/ports/www/opera-flashplugin
# make install

说明: 只执行最后一步就可以了, 然后ports会自动安装依赖包。为了读者清楚起见, 我们在这里分成了几步加以解释。

如果您遵照上面的说明进行了操作, 当您在浏览器地址栏输入 "about:plugins", Flash插件就会被列出来。

[索引] [第十二章 - 硬件与特定平台问题] [第十四章 - 配置磁盘]


[back]www@openbsd.org
$OpenBSD: faq13.html, v 1.126 2009/01/25 18:09:49 jasper Exp $