给 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 |
截图:
Anonymous 在 2008年08月13日 11:35 说:【 】
要先安装mencoder吧,要不然不能用
bones7456 在 2008年08月13日 12:19 说:【 】
呃…mencoder肯定要先装上啊,还需要 zenity 呢…
Corsair 在 2008年08月13日 12:47 说:【 】
呵呵,我以前曾经想搞类似的东西,不过最后没有写成脚本…
http://corsairdoom.blogspot.com/2007/06/how-to-convert-video-for-ipod-freeway.html
bones7456 在 2008年08月13日 13:19 说:【 】
@Corsair: 可能你搞得复杂了,音频视频分离以后再合成,我这里会出现声画不同步的情况.
Anonymous 在 2008年08月13日 13:26 说:【 】
字幕按照你说的做了后,还是出现乱码。。。。
bones7456 在 2008年08月13日 13:41 说:【 】
@匿名: 那就要看你的字幕是啥编码的了,如果是GB2312的话,应该是可以解决的. 还有你用mplayer播放的时候正常吗? 顺便看看字体有没有中文,也就只有这么几个注意点了.
Anonymous 在 2008年08月13日 14:47 说:【 】
字幕编码是GB18030 mplayer播放正常 使用文泉驿正黑
Anonymous 在 2008年08月13日 14:49 说:【 】
字幕编码是GB18030 mplayer播放正常 使用文泉驿正黑,但是转出来后 就是乱码,是不是要在mencoder.conf里再添加一些配置信息,例如对使用字体的配置?
但是我又不知道该怎么写这个配置。
bones7456 在 2008年08月13日 15:24 说:【 】
可以 cp ~/.mplayer/config /.mplayer/mencoder.conf 试试.
两者的配置文件差不多的格式.
不行的话,就在命令行里面直接执行mencoder,加上脚本里面的参数,看看输出.
Anonymous 在 2008年08月13日 15:35 说:【 】
man 了一下mencoder mencoder.conf里再加入这几个就好了
subcp=cp936
subfont=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttf
subfont-encoding=unicode
subfont-text-scale=3.5
呵呵 再次谢谢bones7456给大家写了这脚本。
bones7456 在 2008年08月13日 15:42 说:【 】
@匿名: 哈哈,恭喜~
Anonymous 在 2008年08月13日 15:57 说:【 】
对了,建议你增加一个批量转的脚本
bones7456 在 2008年08月13日 16:02 说:【 】
@匿名: 个人觉得右键点比较方便,要批量的话,加个for循环也就可以了,呵呵.
xiooli 在 2008年08月13日 23:15 说:【 】
哈哈,原来骨头偷偷的在干这个东东哈,怎么都不放出去呢?
ps:eval “$CMD 2>&1” 这句里面后面那几个是什么意思啊?
xiooli 在 2008年08月13日 23:17 说:【 】
哦,我明白了,是html里面的东西,显示在脚本里面叫我看半天没搞明白。。。。。。。。。。
bones7456 在 2008年08月14日 11:38 说:【 】
@xiooli: 呵呵,什么叫”偷偷”啊? 论坛里我也发了,linuxtoy也发了,想不出还能发哪里了哦~~
那个 >& 是WP给转的…唉….
transtone 在 2008年08月15日 01:05 说:【 】
你好,能共享一下图片中的字体吗?
bones7456 在 2008年08月15日 09:21 说:【 】
@transtone: 那就是文泉驿正黑啊, http://wenq.org/?ZenHei
Ultimate Guide to Manage Your iPod under Linux : Revised 在 2008年09月11日 13:03 说:【 】
[…] Here is the command we’re gonna run: (based on bones7456’s nautilus toiPod script) […]
iPod touch 转换脚本 | 幻影泡沫 在 2008年09月27日 11:10 说:【 】
[…] thank you,bones7456 […]
drivel 在 2008年11月20日 22:35 说:【 】
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”)
一直出错…
bones7456 在 2008年11月20日 23:49 说:【 】
@drivel: 请把脚本保存为 ~/.gnome2/nautilus-scripts/toIpod 以后,在nautilus里面点右键执行.
否则请确保shell是bash.
drivel 在 2008年11月23日 00:34 说:【 】
的确是 bash 没错…
drivel 在 2008年11月23日 00:35 说:【 】
bash: ./.gnome2/nautilus-scripts/toIpod:/bin/bash^M:损坏的解释器: 没有该文件或目录
bones7456 在 2008年11月23日 20:35 说:【 】
@drivel: 可能你的系统里面没有 /bin/bash ?那你把第一行改成 # #!/bin/sh 试试?
另一根骨头 在 2009年02月26日 08:53 说:【 】
刚入手M8,正愁视频转换的问题来的,完美解决,哈哈
bones7456 在 2009年02月26日 09:34 说:【 】
呵呵,M8如何啊?屏幕分辨率多少来着?
linux下转换rmvb到mp4 | Up Life 在 2009年11月01日 19:19 说:【 】
[…] 新买了一个Ipod touch,转换视频格式是一件麻烦事,发现用ffmpeg转换rmvb视频的效果很不好,非常卡(可能是我没加参数的缘故)。改用mencoder,mencoder命令参数让人头疼,我不想浪费时间琢磨了,所以搜了一下,发现了这个帖子,不过作者的脚本我没运行成功,只好提取出核心的命令: 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 试了一下,效果不错。 […]
Matty 在 2009年12月26日 19:27 说:【 】
为什么我右键toIpod一个电影(avi),出现“正在转换….”窗口又马上没了。文件夹里生成了.mp4的文件,但是大小是0.
mencoder和zenity都装了,mplayer也能正常播放这个电影。
我用的是amd64 ubuntu 9.10.
请教下怎么回事谢谢!
Matty 在 2009年12月26日 19:29 说:【 】
这个是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
bones7456 在 2009年12月26日 21:32 说:【 】
试试运行 ./toIpod ~/Ubuntu\ One/Share\ Folder/\[2012\].2012.R5.LINE.XviD-MDMA.CD1.avi
然后确保 ls -l /bin/sh 是指向bash的,而不是dash。
Matty 在 2009年12月27日 09:37 说:【 】
ls -l /bin/sh 显示是指向dash。怎么把改成指向bash?
还有这个指向是什么意思啊?用ubuntu刚几个月不懂这东西
bones7456 在 2009年12月27日 10:50 说:【 】
这样就是bash了,这个就是一个默认的脚本解释器。
milkliker 在 2009年12月29日 21:48 说:【 】
也遇到了和Matty同样的问题,我也是Ubuntu9.10,生成了大小为0的.mp4文件。
望能得到LZ解答~ 谢谢了!
milkliker 在 2009年12月30日 00:03 说:【 】
刚刚发现是没装faac,装好之后还是报错说,Audio LAVC, couldn’t find encoder for codec libfaac.
后来看见一篇文章说把 -oac lavc 换成 -oac faac就OK了~
谢谢LZ的无私分享!
bones7456 在 2009年12月30日 08:46 说:【 】
哦~这样也行啊?呵呵,谢了~
UbuntuSkills | visense 在 2010年01月02日 10:09 说:【 】
[…] 详情请查看出处。 […]
Ubuntu 命令技巧 在 2010年05月01日 19:38 说:【 】
[…] 详情请查看出处。 […]
zcw159357 在 2010年05月08日 12:25 说:【 】
每次运行都一闪而过阿….只生成0大小的文件….sh指向bash没错阿….直接执行sh toIpod 123.flv
出来的是一大串awk: warning: escape sequence `\(‘ treated as plain `(‘…..求解…..
bones7456 在 2010年05月08日 12:36 说:【 】
awk那个只是警告而已,应不会影响结果的。你要确认的是你的mencoder是否有足够的编码器和解码器,来搞定你输入的文件。你可以手工执行下程序生成的 mencoder 命令行试试。
zcw159357 在 2010年05月08日 12:50 说:【 】
请问 怎么确认mencoder是否有足够的编码器和解码器 手工执行下程序生成的 mencoder 命令行又怎么弄? 我还是菜鸟…
zcw159357 在 2010年05月08日 14:44 说:【 】
执行“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了阿…
bones7456 在 2010年05月08日 18:41 说:【 】
恩,就是这个原因了。mencoder找不到你的faac编码器,这个要根据你发行版的不同,用不同的解决办法的,多google吧,呵呵。
zcw159357 在 2010年05月09日 15:31 说:【 】
我是ubuntu 10.04的 怎么解决阿