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

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

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

#1

帖子 laborer » 2008-01-14 11:20

这个脚本用于将一般格式的视频文件转换为很多常见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[@]}"
附件
mp4.gz
mp4转换脚本
(700 Bytes) 下载 159 次
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
grissiom_lxy
帖子: 41
注册时间: 2008-01-14 11:14
送出感谢: 0
接收感谢: 0

#2

帖子 grissiom_lxy » 2008-01-14 13:43

看来搂住是mencoder大牛…… :shock:
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京
送出感谢: 0
接收感谢: 2 次

#3

帖子 aBiNg » 2008-01-15 16:07

循环给var[${#var[@]}]赋值的方式不错。:)

代码: 全选

if getopts r:v:a:t: key $@; then 

r前加个前导冒号啊,既然只是判断,不必输出错误信息了吧。

laborer:
trap语句段是为何呢?
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

#4

帖子 laborer » 2008-01-16 5:37

aBiNg 写了:循环给var[${#var[@]}]赋值的方式不错。:)

代码: 全选

if getopts r:v:a:t: key $@; then 

r前加个前导冒号啊,既然只是判断,不必输出错误信息了吧。

laborer:
trap语句段是为何呢?


错误信息还是有点用的

trap是为了在按ctrl-c以后停止后台运行的进程,另外做一些必要的清理。
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#5

帖子 eexpress » 2008-01-16 8:37

网上有这种脚本。蛮多的。看不下去,复杂,而且功能都是通常的功能,没什么意义。直接mencoder写,也简单的。
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#6

帖子 eexpress » 2008-01-16 8:38

http://eexpress.blog.ubuntu.org.cn/2007/12/06/学习mencoder的好软件。devede/
除开把这软件加强。
● 鸣学
回复

回到 “Shell脚本”