注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

仙贝猪的神仙岛

大家一起踩

 
 
 

日志

 
 

在Linux平台上进行内嵌字幕操作  

2010-01-31 21:21:54|  分类: ComputerScience |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
内嵌字幕,或者用专业的词来说叫做字幕硬编码入视频。
于是,编码操作是必须的,这时想到了大名鼎鼎的mencoder,于是进行如下测试:
$mencoder -ass -subcp enca:zh:cp936 -vf ass,scale -sub myfile.ass myfile.avi -ovc x264 -x264encopts ...以下省略。。
结果。。MENCODER表示无法识别字幕格式,记得mplayer -ass可以正常识别ASS文件的,我表示mencoder在编写的时候是不是漏了些什么。。于是 采取土方法:

$mkfifo -m 600 stream.y4m
$mkfifo -m 600 stream.wav

以下放在一个bash脚本(&> 不被标准sh支持)里 一回车[为了看清每行开头有行号]。当然x264是--tune animation还是film,以及其他参数,大家自己看着办咯(我表示为什么我最终还是把GPAC/MP4编译到x264中了),默认参数效果相当好。至于mplayer的-vf,感觉从压片的角度来看,scale也是挺必要的,于是也放着。由于scale的目标是yuv4mpeg,硬件缩放就不指望了,为了保证质量,-sws 9指定mplayer使用最好的缩放算法进行处理。

1 mplayer -nosound -ass -subcp enca:zh:cp936 -sws 9 -vf ass,scale=848:480 -sub myfile.ass -vo yuv4mpeg:file=stream.y4m myfile.avi &> /dev/null &
2 x264 --tune animation stream.y4m -o inter_video.mp4
3 mplayer -novideo -ao pcm:file=stream.wav myfile.avi &> /dev/null &
4 neroAacEnc -if stream.wav -of inter_audio.mp4 -br 96000 -he
5 MP4Box -add inter_video.mp4 -add inter_audio.mp4 final.mp4

对于neroAacEnc来说,如果输入不是FIFO,可以执行2pass,我的/tmp目录是tmpfs,也就是有1G内存空间被我当作磁盘用,假设解出的WAV能放在/tmp中,我会考虑使用neroAacEnc进行2pass 命令行只要加上-2pass即可。
对于MP4Box,偶手头这个版本正好悲剧,目标mp4那个参数不支持Unicode(神奇的是-add的参数支持Unicode),之后的版本修正了这个问题。

于是有必要感慨一下,fifo的强大。
FIFO,先进先出,虽然创建在磁盘上,但并没有任何内容,只是有个可以供使用的名称。
当写入程序和读取程序同时打开FIFO进行写(例子中的mplayer)/读(例子中的x264,neroAacEnc)时,系统不经过磁盘直接传递数据,这使得必须使用那些简单的以*.y4m(YUV4MPEG, MPEG工具默认使用的无压缩视频格式) *.wav作为输入的程序的时候,不用为了磁盘空间不足而郁闷。

之后再解释下mplayer命令行
$mplayer -nosound -ass -subcp enca:zh:cp936 -sws 9 -vf ass,scale=848:480 -sub myfile.ass -vo yuv4mpeg:file=stream.y4m myfile.avi &> /dev/null &
-nosound顾名思义,-ass表示启用ASS/SSA高级字幕支持,为了读取myfile.ass能够成功。-subcp指定字幕文件的编码,enca是一个自动编码检测软件,zh表示先从zh(中文)语系中查找,cp936是查找失败的默认值(cp936就是通常所说的GBK)。一般ass文件都以Unicode(UCS-2)编码,会被自动检测出来,关系不大。-sws这里再讲一下,作为软件缩放算法的选择:
              Available types are:

                 0    fast bilinear
                 1    bilinear
                 2    bicubic (good quality) (default)
                 3    experimental
                 4    nearest neighbor (bad quality)
                 5    area
                 6    luma bicubic / chroma bilinear
                 7    gauss
                 8    sincR
                 9    lanczos
                 10   natural bicubic spline
默认值是双三次,质量的确不错,0最快,效果比较差。至于bilinear,其实不是很糟哦,当然最好的是lanczos(You Mean CPU Usage? Yes,it cost a lot...)
-vf ass,scale=848:480
表示在给输出设备以前,处理ass和scale,对于输出到yuv4mpeg这种文件来说,在输出以前处理ASS表示输出的文件上会看见字幕(否则就没咯)。对于scale参数,简言之就是软件缩放。在播放视频时,有些视频驱动(如XVideo, GL, DirectX, D3D)在硬件满足要求的时候支持:只要告诉输出设备需要缩放,需要添加字幕,输出设备(显卡等)会自行处理。
-sub file 指定字幕文件= =
-vo yuv4mpeg:file=stream.y4m 指定输出方式,这里指定为输出YUV4MPEG无压缩视频文件,这种文件去掉文件头可以直接扔给显卡要求播放。file=stream.y4m 就是指定输出文件名。
&> /dev/null &
&> 是将mplayer所有的输出重定向,还我一个清静的屏幕。/dev/null是*nux上的一个特殊的文件,所有输出的到这个文件的内容都会凭空消失。我表示Windows 的cmd有个对应物 NUL
如mplayer.exe ....... &> NUL
就相当于 mplayer ...... &> /dev/null
最后一个&表示整个任务放到后台,不等待它完成。在这里,它之后的一条命令x264是要和它同步进行的,所以这是必须的。

__最后感慨一下,*NIX的哲学是,零碎的工具因为系统而整合。

  评论这张
 
阅读(1138)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018