bash script: แบ่งไฟล์สื่อออกเป็นหลาย ๆ ส่วน
เห็นคำถามเกี่ยวกับการแบ่งไฟล์สื่อออกเป็นหลายส่วนที่ ubuntuclub.com
ด้วยต้องการคลายเครียด จึงวางแผนลงมือเขียนสคริปต์ โดยคิดให้สคริปต์มีการทำงานดังต่อไปนี้
- หาความยาวสื่อ ด้วยโปรแกรม ffmpeg ด้วยคำสั่ง
ffmpeg -i "$INFILE" 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
- หาความยาวแต่ละส่วน (ความยาวสื่อ ÷ จำนวนส่วนที่จะแยก)
- ใช้ mencoder มาตัดส่วน -ss คือ seek ไปยังตำแหน่ง, -endpos คือให้ประมวลผลเท่าใด (เป็นขนาดก็ได้ เป็นจำนวนเฟรมก็ได้ เป็นค่าเวลาก็ได้)
เสร็จแล้วเขียนออกมาหยาบ ๆ และทดสอบไปเล็กน้อยว่าใช้งานได้จริงแล้วเลยเอามาบันทึกไว้กันลืมเสียหน่อย
โดยผลลัพธ์ที่ได้ออกมาเป็นสคริปต์ sep_media.sh เป็นดังนี้:
sep_media.sh:
#!/bin/bash
#
# Script for separate media file by MENCoder
# by Thanomsub Noppaburana <donga.nb@gmail.com>
# Usage: sep_media.sh
# Example:
# For separate Doraemon.avi into 20 parts with prefix "Doraemon_Part"
# sep_media.sh Doraemon.avi Doraemon_Part 20
#
INFILE="$1"
OUTFILEPREFIX="$2"
TOTALPART="$3"
EXTENSION=""
[ ! -z "$INFILE" ] && EXTENSION="`echo "$INFILE" | awk -F . '{print $NF}'`"
## ----------------------------------------------------------------- ##
## functions declaration
## ----------------------------------------------------------------- ##
usage() {
echo
echo -e "Usage:"
echo -e "\t`basename $0` "
echo -e "Example:"
echo -e "\tFor separate Doraemon.avi into 20 parts with prefix \"Doraemon_Part\""
echo -e "\tsep_media.sh Doraemon.avi Doraemon_Part 20"
echo
}
getTotalLength() {
echo `ffmpeg -i "$INFILE" 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | awk -F: '{ print ($1*3600)+($2*60)+$3 }'`
}
getEachPartLength() {
echo $1:$2 | awk -F: '{ print $1/$2 }'
}
separateMedia() {
TOTALPART=$1
TOTALLENGTH=$2
EACHPARTLENGTH=$3
for ((i=0;i<$TOTALPART;i++))
do
STARTPOS=`echo $i $EACHPARTLENGTH | awk '{print ($1*$2)+0.01}'`
echo "====================================================================================================="
echo " Separating media part $i: $OUTFILEPREFIX$i.$EXTENSION : "
echo "-----------------------------------------------------------------------------------------------------"
mencoder -of lavf -oac copy -ovc copy -o $OUTFILEPREFIX$i.$EXTENSION -ss $STARTPOS -endpos $EACHPARTLENGTH $INFILE
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
done
}
## ----------------------------------------------------------------- ##
## main program
## ----------------------------------------------------------------- ##
if [ -z "$INFILE" -o -z "$OUTFILEPREFIX" -o -z "$TOTALPART" ];
then
usage
exit 0
fi
TOTALLENGTH=`getTotalLength`
EACHPARTLENGTH=`getEachPartLength $TOTALLENGTH $TOTALPART`
separateMedia $TOTALPART $TOTALLENGTH $EACHPARTLENGTH
วิธีใช้งาน:
ตัวอย่างเช่น ต้องการแยก Doraemon.avi เป็น 20 ส่วน โดยให้ไฟล์ที่โดนแยกนำหน้าด้วยชื่อ "Doraemon_Part"
sep_media.sh Doraemon.avi Doraemon_Part 20
ซึ่งก็จะได้ผลลัพธ์เป็นแฟ้ม Doraemon_Part0.avi ถึง Doraemon_Part19.avi ออกมา เป็นต้น
ดาวน์โหลด:
ผู้สนใจสามารถดาวน์โหลดไปใช้ได้เลยครับ ดาวน์โหลดสคริปต์ sep_media.sh
จากนั้นเซฟไว้ใน search path และอย่าลืมตั้ง permission ให้ประมวลผลได้ก่อน ด้วยคำสั่ง
sudo chmod ugo+x /path/to/sep_media.sh
เป็นอันพร้อมใช้งานครับ ^_^
- donga's blog
- Printer-friendly version
- Log in or register to post comments
- 33051 reads







Comments
ใส่แท็กฉันใดครับ
อาจารย์วิทยาครับ จะใส่แท็กให้บทความต้องทำฉันใดครับ แหะ ๆ
:-)
โด่งครับ.
หมายถึงแท็กอะไรหรือครับ
หมายถึงแท็กอะไรหรือครับ
หมายถึงแท็กคำค้นน่ะครับ เช่น
หมายถึงแท็กคำค้นน่ะครับ เช่น tags: bash, script, multimedia อะไรอย่างนี้น่ะครับ
:)
เติมตรง Topic ใต้ Title
เติมตรง Topic ใต้ Title น่ะครับ
เติมคำไปตรง ๆ เลย คั่นด้วย comma
แท็กเก่าที่ผมทำ มันจะค่อนข้างมั่ว ๆ หน่อย เพราะทำไปศึกษาไป
คุณโด่งพิจารณาเอาเองเลยครับ
ขอบคุณครับผม
ขอบคุณครับผม
Re: bash script: แบ่งไฟล์
แอ้... มี writer ใหม่มาเขียนบล็อกด้วยแหะ เขียนมาเยอะๆนะครับ เฝ้าติดตามอยู่เสมอน้า