没啥意思的站点

给 iPod 转视频的脚本

由于新买了个 iPod touch,这几天认真钻研了下它的视频格式,搞了个nautilus脚本,使用mencoder做后端.
以后想把某个视频文件转成iPod的格式的话,直接在 nautilus 里面右键点文件-脚本-toIpod 就可以搞定了.
脚本的特点:
* 借助mplayer的强大,支持N多的源格式(已测试: avi rmvb mov flv).
* 支持srt/ass格式的外挂字幕.
* 自动缩放画面比例到适合ipod touch的480*320,如果是 ipod shuffle 之类的话,可以自己修改下脚本.
* 可视化的进度提示
* 转换速度较快
* 默认保存到当前目录,可修改脚本,输出到统一目录,方便管理.会自动加上 _ipod.mp4 的后缀名.
使用方法,保存以下脚本到 ~/.gnome2/nautilus-scripts/toIpod ,并加可执行权限…或者这里下载

PS: 如果压缩出来的字幕有乱码,请参照我以前的文章,建个 ~/.mplayer/mencoder.conf 文件,写上一行 subcp=cp936 就好了.

#!/bin/bash
#filename: ~/.gnome2/nautilus-scripts/toIpod
#Copyright (c) 2008 bones7456 (bones7456<A>gmail<D>com)
#License: GPL
#version 20081101
#用于将视频转成 ipod touch / iphone 格式.右击文件使用
 
SAVEDIR=`pwd`
#SAVEDIR="/data/movie"
 
INFILE="$1"
PWD=`pwd`
CMD="mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc "
CMD+="-lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=600:acodec=libfaac:abitrate=128 "
CMD+="-af lavcresample=22050 -vf dsize=480:320:0,scale=0:0,expand=480:320,harddup -ofps 25 -srate 22050 "
P="没有找到对应的字幕."
if [[ -f "${INFILE%.*}.srt" ]];then
	CMD+=" -sub ""\"$PWD/${INFILE%.*}.srt\""
	P="找到字幕文件: ""${INFILE%.*}.srt"
elif [[ -f "${INFILE%.*}.ssa" ]];then
	CMD+=" -sub ""\"$PWD/${INFILE%.*}.ssa\""
	P="找到字幕文件: ""${INFILE%.*}.ssa"
elif [[ -f "${INFILE%.*}.aas" ]];then
	CMD+=" -sub ""\"$PWD/${INFILE%.*}.aas\""
	P="找到字幕文件: ""${INFILE%.*}.aas"
fi
 
CMD+=" -o ""\"$SAVEDIR/${INFILE%.*}_ipod.mp4\""" ""\"$PWD/$INFILE\""
P+="\n\n保存目录: $SAVEDIR"
P+="\n\n是否继续?"
#echo "$CMD" >> ~/toIpod.log
if ! zenity --question --text "$P" ; then
	exit 0;
fi
 
eval "$CMD 2>&1" |\
while read line; do echo $line |\
awk -F '[ :\(\)%]+' '/^Pos/{print "# 速度:",$5,"(点\"取消\"转入后台运行.)";print $4}' ; done |\
zenity --progress --title "正在转换..." --percentage=0 --auto-close --width=500

截图:
工作截图

39 评论

  1. 要先安装mencoder吧,要不然不能用

  2. 呃…mencoder肯定要先装上啊,还需要 zenity 呢…

  3. 呵呵,我以前曾经想搞类似的东西,不过最后没有写成脚本…
    http://corsairdoom.blogspot.com/2007/06/how-to-convert-video-for-ipod-freeway.html

  4. @Corsair: 可能你搞得复杂了,音频视频分离以后再合成,我这里会出现声画不同步的情况.

  5. 字幕按照你说的做了后,还是出现乱码。。。。

  6. @匿名: 那就要看你的字幕是啥编码的了,如果是GB2312的话,应该是可以解决的. 还有你用mplayer播放的时候正常吗? 顺便看看字体有没有中文,也就只有这么几个注意点了.

  7. 字幕编码是GB18030 mplayer播放正常 使用文泉驿正黑

  8. 字幕编码是GB18030 mplayer播放正常 使用文泉驿正黑,但是转出来后 就是乱码,是不是要在mencoder.conf里再添加一些配置信息,例如对使用字体的配置?
    但是我又不知道该怎么写这个配置。

  9. 可以 cp ~/.mplayer/config /.mplayer/mencoder.conf 试试.
    两者的配置文件差不多的格式.
    不行的话,就在命令行里面直接执行mencoder,加上脚本里面的参数,看看输出.

  10. man 了一下mencoder mencoder.conf里再加入这几个就好了
    subcp=cp936
    subfont=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttf
    subfont-encoding=unicode
    subfont-text-scale=3.5

    呵呵 再次谢谢bones7456给大家写了这脚本。

  11. @匿名: 哈哈,恭喜~

  12. 对了,建议你增加一个批量转的脚本

  13. @匿名: 个人觉得右键点比较方便,要批量的话,加个for循环也就可以了,呵呵.

  14. 哈哈,原来骨头偷偷的在干这个东东哈,怎么都不放出去呢?

    ps:eval “$CMD 2>&1” 这句里面后面那几个是什么意思啊?

  15. 哦,我明白了,是html里面的东西,显示在脚本里面叫我看半天没搞明白。。。。。。。。。。

  16. @xiooli: 呵呵,什么叫”偷偷”啊? 论坛里我也发了,linuxtoy也发了,想不出还能发哪里了哦~~
    那个 >& 是WP给转的…唉….

  17. 你好,能共享一下图片中的字体吗?

  18. @transtone: 那就是文泉驿正黑啊, http://wenq.org/?ZenHei

  19. botu@botu-laptop:~$ sh toIpod abc.flv
    : not found
    : not found
    toIpod: 13: CMD+=-lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=600:acodec: not founditrate=128
    toIpod: 14: CMD+=-af lavcresample=24000 -vf dsize=480:320:0,scale=0:0,expand=48: not foundup -ofps 25 -srate 22050
    toIpod: 19: Syntax error: “elif” unexpected (expecting “then”)

    一直出错…

  20. bones7456

    2008年11月20日 在 23:49

    @drivel: 请把脚本保存为 ~/.gnome2/nautilus-scripts/toIpod 以后,在nautilus里面点右键执行.
    否则请确保shell是bash.

  21. 的确是 bash 没错…

  22. bash: ./.gnome2/nautilus-scripts/toIpod:/bin/bash^M:损坏的解释器: 没有该文件或目录

  23. bones7456

    2008年11月23日 在 20:35

    @drivel: 可能你的系统里面没有 /bin/bash ?那你把第一行改成 # #!/bin/sh 试试?

  24. 刚入手M8,正愁视频转换的问题来的,完美解决,哈哈

  25. 为什么我右键toIpod一个电影(avi),出现“正在转换….”窗口又马上没了。文件夹里生成了.mp4的文件,但是大小是0.

    mencoder和zenity都装了,mplayer也能正常播放这个电影。
    我用的是amd64 ubuntu 9.10.
    请教下怎么回事谢谢!

  26. 这个是terminal中结果:也是生成个0大小的文件就没下文了。
    wraith@wraith-desktop:~/.gnome2/nautilus-scripts$ sh toIpod ~/Ubuntu\ One/Share\ Folder/\[2012\].2012.R5.LINE.XviD-MDMA.CD1.avi
    toIpod: 14: CMD+=-lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=600:acodec=libfaac:abitrate=128 : not found
    toIpod: 15: CMD+=-af lavcresample=22050 -vf dsize=480:320:0,scale=0:0,expand=480:320,harddup -ofps 25 -srate 22050 : not found
    toIpod: 26: [[: not found
    toIpod: 26: [[: not found
    toIpod: 26: [[: not found
    toIpod: 28: CMD+= -o “/home/wraith/.gnome2/nautilus-scripts//home/wraith/Ubuntu One/Share Folder/[2012].2012.R5.LINE.XviD-MDMA.CD1_ipod.mp4” “/home/wraith/.gnome2/nautilus-scripts//home/wraith/Ubuntu One/Share Folder/[2012].2012.R5.LINE.XviD-MDMA.CD1.avi”: not found
    toIpod: 29: P+=\n\n保存目录: /home/wraith/.gnome2/nautilus-scripts: not found
    toIpod: 30: P+=\n\n是否继续?: not found

    • 试试运行 ./toIpod ~/Ubuntu\ One/Share\ Folder/\[2012\].2012.R5.LINE.XviD-MDMA.CD1.avi
      然后确保 ls -l /bin/sh 是指向bash的,而不是dash。

  27. 也遇到了和Matty同样的问题,我也是Ubuntu9.10,生成了大小为0的.mp4文件。

    望能得到LZ解答~ 谢谢了!

  28. 刚刚发现是没装faac,装好之后还是报错说,Audio LAVC, couldn’t find encoder for codec libfaac.

    后来看见一篇文章说把 -oac lavc 换成 -oac faac就OK了~

    谢谢LZ的无私分享!

  29. 每次运行都一闪而过阿….只生成0大小的文件….sh指向bash没错阿….直接执行sh toIpod 123.flv
    出来的是一大串awk: warning: escape sequence `\(‘ treated as plain `(‘…..求解…..

    • awk那个只是警告而已,应不会影响结果的。你要确认的是你的mencoder是否有足够的编码器和解码器,来搞定你输入的文件。你可以手工执行下程序生成的 mencoder 命令行试试。

      • 请问 怎么确认mencoder是否有足够的编码器和解码器 手工执行下程序生成的 mencoder 命令行又怎么弄? 我还是菜鸟…

  30. 执行“mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=600:acodec=libfaac:abitrate=128 -af lavcresample=22050 -vf dsize=480:320:0,scale=0:0,expand=480:320,harddup -ofps 25 -srate 22050 -o output.mp4 input.rmvb”么? 回显“Audio LAVC, couldn’t find encoder for codec libfaac.” 但我已经装了faac了阿…

匿名进行回复 取消回复