分页: 1 / 1

mp4播放器视频格式转换脚本

发表于 : 2008-01-14 11:20
laborer
这个脚本用于将一般格式的视频文件转换为很多常见mp4机所支持的xvid格式的avi,功能类似于mp4机驱动光盘中附带的AVIConverter。视频格式转换由mencoder完成,所以机器上需要预先装好mencoder才能使用这个脚本。它的使用方法很简单,如下面这个例子:

代码: 全选

./mp4 -r 320x240 -v 300 -a 128 -t 2 ../abc/*.avi
将../abc/*.avi文件转换为mp4机使用的xvid格式并保存在当前目录,转换的目标视频分辨率为320x240,其中视频部分的码率为300kbps,音频的码率为128kbps,为提高双核cpu的使用率,使用两个线程同时转换。

注意:很多2寸的播放器需要将输出分辨率指定为220x176。

代码: 全选

#!/bin/sh

res=320x240
vbr=300
abr=128
threads=2


encode_thread() {
    for f in "${src[@]}"; do
        name=`basename "$f"`
        if rm "${name}.lock" 1>/dev/null 2>&1; then
            name="[mp4]${name%.*}.avi"
            echo "[$1]Processing: $f"
            nice mencoder \
                "$f" \
                -o "$name" \
                -noodml \
                -of avi \
                -ofps 20 \
                -vf-add scale=${res%x*}:-3 \
                -vf-add expand=${res%x*}:${res#*x} \
                -vf-add scale=-3:${res#*x} \
                -vf-add expand=${res%x*}:${res#*x}:-1:-1:1 \
                -srate 44100 \
                -ovc xvid \
                -xvidencopts bitrate=${vbr}:max_bframes=0:quant_type=h263:me_quality=4 \
                -oac lavc \
                -lavcopts acodec=mp2:abitrate=${abr} \
                -really-quiet \
                1>/dev/null 2>&1
        fi
    done
}


unset src
while [[ -n "$@" ]]; do
    if getopts r:v:a:t: key $@; then
        case $key in
            r) res="$OPTARG" ;;
            v) vbr="$OPTARG" ;;
            a) abr="$OPTARG" ;;
            t) threads="$OPTARG" ;;
        esac
        shift $((OPTIND-1))
    else
        src[${#src[@]}]="$1"
        name=`basename "$1"`
        touch "${name}.lock"
        shift
    fi
    OPTIND=0
done

unset pid
for ((i=1; i<=threads; i++)); do
    encode_thread $i &
    pid[${#pid[@]}]="$!"
done

trap 'rm *.lock; kill "${pid[@]}"' SIGINT
wait "${pid[@]}"

发表于 : 2008-01-14 13:43
grissiom_lxy
看来搂住是mencoder大牛…… :shock:

发表于 : 2008-01-15 16:07
aBiNg
循环给var[${#var[@]}]赋值的方式不错。:)

代码: 全选

if getopts r:v:a:t: key $@; then 
r前加个前导冒号啊,既然只是判断,不必输出错误信息了吧。

laborer:
trap语句段是为何呢?

发表于 : 2008-01-16 5:37
laborer
aBiNg 写了:循环给var[${#var[@]}]赋值的方式不错。:)

代码: 全选

if getopts r:v:a:t: key $@; then 
r前加个前导冒号啊,既然只是判断,不必输出错误信息了吧。

laborer:
trap语句段是为何呢?
错误信息还是有点用的

trap是为了在按ctrl-c以后停止后台运行的进程,另外做一些必要的清理。

发表于 : 2008-01-16 8:37
eexpress
网上有这种脚本。蛮多的。看不下去,复杂,而且功能都是通常的功能,没什么意义。直接mencoder写,也简单的。

发表于 : 2008-01-16 8:38
eexpress