以下是在 FreeBSD 下先抓音軌再壓 mp3 的方法,

至於直接由 CD 壓的方法則在最後討論。



目前在 FreeBSD 下有兩個由 SCSI CDROM 抓音軌的程式,

一是 tosha-0.05 一是 cdd-1.0。

這兩個程式你都可在 freebsd.csie.nctu.edu.tw 找到。

所支援的 SCSI CDROM 廠牌也有限,

如果不認得的廠牌會給你 Warning 的 message。

你可以先試壓一首看看,再修改原程式。

tosha and cdd 抓的 size 有點不同,cdd 會小一點,但內容又沒錯。

tosha 與 DOS 下的 cdgrabp 抓的大小、內容一樣,至少在我的

Pioneer DR-U124X 4.4 倍速 CDROM 是如此。

至於 IDE CDROM 的抓音軌程式就要靠你寫了。



壓 mp3 的程式即 l3enc linux 版,目前尚無 FreeBSD 版,

因此你要 load linux module,這部分就不討論了,假設你會。

l3enc 的 register code 你可以問問你的朋友,應該不難找到。



假設你要壓第一首,可以如此做:

tosha -t 1 -o tmp.raw

l3enc tmp.raw track01.mp3 -br 128000 -sr 44100



這樣就產生 track01.mp3 的檔案。play 看看有沒有問題。

l3enc 有個 -hq 的參數,但壓的速度是三倍慢。

下面這個 shell script 可以將整張 CD 一一壓成 mp3。

所以,晚上睡前放一張,隔天就壓好了。

你可以放在 background run,又不影響你的正常工作。

但是請你先看一下程式,測一下,確定你知道每一步驟在作什麼。

---------------- cut here -----------------------------------

#!/bin/sh

# usage: makemp3.sh [from_which_track]

#

LD_LIBRARY_PATH=/compat/linux/lib;export LD_LIBRARY_PATH

LOGFILE=./makemp3.log

TMPFILE=./tmp.raw

NTRACK=`tosha -i 2>&1 | tail -n 3 | head -n 1 | colrm 7`

if [ $# -gt 0 ]; then

        CURRENT=$1

        if [ ${CURRENT} -le 0 ]; then

                CURRENT=1

                break

        fi

        if [ ${CURRENT} -gt ${NTRACK} ]; then

                echo "The request track larger than total number of track"

                exit 0

        fi

else

        CURRENT=1

fi

cp /dev/null ${LOGFILE}

cp /dev/null ${TMPFILE}

tosha -i 2>> ${LOGFILE}

echo "total ${NTRACK} track" >> ${LOGFILE}

while [ ${CURRENT} -le ${NTRACK} ]

do

# if there is a file named "stop" on the current directory

# then the job will stop

        if [ -f stop ]; then

                echo "job stop at `date`" >> ${LOGFILE}

                rm ${TMPFILE}

                scsi -f /dev/rcd0c -c "1b 0 0 0 0 0"

                exit 0

        fi

        if [ ${CURRENT} -ge 10 ]; then

                OUTPUT="track${CURRENT}"

        else

                OUTPUT="track0${CURRENT}"

        fi

        echo "compress track ${CURRENT} begin at `date`" >> ${LOGFILE}

        tosha -q -t ${CURRENT} -o ${TMPFILE} 2> /dev/null

l3enc ${TMPFILE} ${OUTPUT}.mp3 -br 128000 -sr 44100 > /dev/null 2>&1

        echo "track ${CURRENT} completed at `date`" >> ${LOGFILE}

        CURRENT=`expr ${CURRENT} + 1`

done

echo "job completed at `date`" >> ${LOGFILE}

rm ${TMPFILE}

scsi -f /dev/rcd0c -c "1b 0 0 0 0 0"

--------------------- cut here -----------------------------------



l3enc 這個程式是不從 stdin 讀 wav or pcm data 的,當然你也可以這樣作:

tosha -q -t 1 -o - | l3enc /dev/stdin track.mp3 -br 128000 -sr 44100

而且也可壓出一樣大小的 mp3,但是與用讀暫存檔的方式壓出來的不一樣。

而用 l3dec 反解回去的 pcm file 也不同。

原因我猜是 l3enc 這個程式用了 ftell 及 fseek。

當然,pipe 是無法作 seek 的,也無法知道 file size。



那有沒有方式直接由 CD -> mp3? 我認為有兩個方法,

一是改 linux shared library,騙 l3enc。

一是自己寫個 audio file system,直接支援 audio track 的讀取。

後者有點殺雞用牛刀,但是比較有趣。