เอาหล่ะครับ วันนี้ผมจะมาแนะนำวิธีการแปลงไฟล์เสียง wav เป็น mp3 โดยใช้โปรแกรม Lame กัน ไม่ได้จะแนะนำการใช้งานโปรแกรม Lame นะครับ บทความนี้เป็นภาคต่อของบทความ วิธีการบันทึกการโทร (Call Recording) ด้วย Asterisk ที่ผมได้เขียนแนะนำไปก่อนหน้านี้แล้ว แต่คราวนั้นผมแนะนำว่าให้บันทึกเสียงเป็นแบบ wav49 ซึ่งเป็นไฟล์ wav ที่บีบอัดแบบ GSM จะประหยัดเนื้อที่ฮาร์ดดิสก์ไปได้เยอะ (ประมาณ 5 เม็กต่อชั่วโมง)
ปล. ถ้าเราแค่บันทึกเสียงแล้วต้องการให้เปิดฟังได้ ไม่ได้คิดจะเอาไฟล์ mp3 นี้ไปทำอย่างอื่น ผมว่าบันทึกเสียงเป็นไฟล์ wav49 หน่ะก็ดีอยู่แล้วนะครับ อย่างน้อยก็ไม่ต้องทำอะไรให้มันยุ่งยากมากขึ้น แต่อย่างไรก็ตามเก็บเป็นไฟล์ mp3 ใช้เนื้อที่น้อยกว่า wav49 นิดหน่อย
แต่การที่เราจะแปลงไฟล์ wav เป็น mp3 ได้นั้น เราจะใช้ไฟล์แบบ wav49 ไม่ได้นะครับ ต้องใช้ไฟล์ wav ธรรมดา ดังนั้นเราต้องเปลี่ยนคำสั่งการบันทึกเสียงใหม่ แบบนี้
exten => _1XX,1,MixMonitor(/tmp/record-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.wav|bW(0))
คือเปลี่ยนนามสกุลไฟล์จาก WAV เป็น wav
1. ติดตั้งโปรแกรม Lame
1.1 เช็คเวอร์ชั่นอัพเดท
http://sourceforge.net/projects/lame/files/lame/
1.2 ดาวน์โหลดไฟล์ Source Code
wget http://downloads.sourceforge.net/projec ... irror=nchc
1.3 คอมไพล์และติดตั้ง
- โค้ด: เลือกทั้งหมด
tar xzvf lame-3.98.4.tar.gz -C /usr/src
cd /usr/src/lame-3.98.4
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var
make
make install
2. การใช้คำสั่ง lame
เรียกดูออปชั่นในการใช้งานโปรแกรม lame
- โค้ด: เลือกทั้งหมด
lame -?
3. แปลงไฟล์เสียงทีละไฟล์
คำสั่งนี้ครับ
- โค้ด: เลือกทั้งหมด
lame -b 16 -m m -q 9 --resample 8 file.wav file.mp3
โดยที่
-b 16 คือบิตเรท 16 บิต
-m m เป็นโหมด mono
-q เป็น quality ค่า 9 คือต่ำที่สุด ช่วยประหยัดเนื้อที่เก็บ ไฟล์เสียงโทรศัพท์มันก็ไม่ใช่ Stereo อยู่แล้ว จึงไม่จำเป็นต้องให้มีคุณภาพมากมาย
--resample 8 เป็นความถี่ของไฟล์เอ๊าท์พุต เลข 8 คือ 8 KHz
file.wav คือไฟล์อินพุต
file.mp3 คือไฟล์เอ๊าท์พุต
มาดูการแปลงจริงๆกันครับ
- โค้ด: เลือกทั้งหมด
lame -b 16 -m m -q 9 --resample 8 100-0870051234-06042010-011720.wav 100-0870051234-06042010-011720.mp3
ผลลัพธ์
ก็จะได้ไฟล์ 100-0870051234-06042010-011720.mp3 อยู่ในไดเร็คตอรี่นี้
ถ้าไม่อยากให้มีข้อความแสดงให้เห็นก็ใส่ออปชั่น --quiet เพิ่มเข้าไปแบบนี้ครับ
- โค้ด: เลือกทั้งหมด
lame -b 16 -m m -q 9 --resample 8 --quiet 100-0870051234-06042010-011720.wav 100-0870051234-06042010-011720.mp3
4. แปลงทีละหลายๆไฟล์
หากต้องการแปลงทีละหลายๆไฟล์ เราต้องใช้ Script ช่วยครับ ซึ่ง Script ด้านล่างนี้จะแปลงทีละไฟล์จนครบทุกไฟล์ สมมติว่าไฟล์ wav เก็บอยู่ที่ไดเร็คตอรี่ /var/spool/asterisk/monitor นะครับ
- โค้ด: เลือกทั้งหมด
#!/bin/bash
recorddir=/var/spool/asterisk/monitor
cd $recorddir
for file in *.wav
do
mp3=$(basename "$file" .wav).mp3
nice lame -b 16 -m m -q 9 --resample 8 --quiet "$file" "$mp3"
touch -r "$file" "$mp3"
done
สร้างเป็นไฟล์ชื่ออะไรก็ได้เช่น convert_mp3.sh เก็บไว้ในไดเร็คตอรี่อะไรก็ได้เช่น /usr/sbin แล้วเซ็ต mode ให้เป็น +x เพื่อให้สั่งรันได้ ด้วยคำสั่งนี้
- โค้ด: เลือกทั้งหมด
chmod +x /usr/sbin/convert_mp3.sh
รันสคริปต์นี้ เราก็จะมีทั้งไฟล์ทั้ง .wav และ .mp3 อยู่ในไดเร็คตอรี่ /var/spool/asterisk/monitor
5. ใช้ Cron ช่วยแปลง
ถ้าเรามีไฟล์ที่ต้องแปลงเป็นจำนวนมาก และก็มีไฟล์แบบนี้ทุกวัน ถ้าต้องมาสั่งรันคำสั่งแปลงทุกวันก็เป็นอะไรที่น่าเบื่อนะครับ ใช้ Cron แปลงให้ดีกว่า
- โค้ด: เลือกทั้งหมด
crontab -e
เพิ่มบรรทัดนี้เข้าไป จะแปลงตอน 00:05 ของทุกวัน
- โค้ด: เลือกทั้งหมด
#Converting MP3
5 0 * * * /usr/sbin/convert_mp3.sh &>/var/spool/asterisk/monitor/log-$(date -d yesterday +%Y%m%d) /dev/null
หากต้องการรันเวลาอื่นแต่ไม่รู้ว่าจะเขียนเวลายังไง เว็บนี้ช่วยได้ครับ http://www.openjs.com/scripts/jslibrary ... rontab.php