行者无疆 始于足下 - 行走,思考,在路上

轻松一刻:电影条形码转换脚本

大概是从去年年初开始认真的写作。怎奈认真的写作有如雕刻,每次写作少则四五个小时,多则十几个小时,极耗体力,因此再不敢轻易提笔。两周前的一篇文章,更是在机缘巧合之下将鄙人推向了舆论的风口浪尖,至今想起来依然心有余悸。写的人累,想必读的人应该也不会太轻松。值此新春佳节,特奉上一篇“技术小品文”,奢望读者百忙之中施舍一笑^~

想象一下,如果把一整部电影压缩成一张图片,那会是怎样壮观的场景?有点迫不急待?看看这里,梯子在这里

是不是想动手尝试下了?可是有这样的软件吗?我没找到。于是唯一的办法就是自己动手,丰衣足食了。代码在这里,依赖Linux/ffmpeg/bc/graphicsmagick。运行过程中需要保证5G以上的可用磁盘空间。转换耗时约30分钟,视电影时长而定。

#!/usr/bin/env bash

################################################################################
# Usage:    A script to convert a movie to a movebarcode
# Author:   Xiao Hanyu
# Depends:
#   ffmpeg:     get basic info of a movie and convert it to a series of images
#   graphicsmagick:
#               convert, mogrify, blur images
#   bc:         shell calculator
################################################################################

function get_duration
{
    ## [0-9]{2}:[0-9]{2}:[0-9]{2}(|\.[0-9]{1,2}) matches:
    ##      hh:mm:ss.ms
    ##      hh:mm:ss
    duration=$(ffmpeg -i $1 2>&1 | grep 'Duration' | grep -E -o "[0-9]{2}:[0-9]{2}:[0-9]{2}(|\.[0-9]{1,2})")
    duration_h=$(echo $duration | awk -F: '{print $1}')
    duration_m=$(echo $duration | awk -F: '{print $2}')
    duration_s=$(echo $duration | awk -F: '{print $3}')
    movie_seconds=$(echo "$duration_h * 3600 + $duration_m * 60 + $duration_s" | bc)
}

function get_fps
{
    fps=$(ffmpeg -i $1 2>&1 | grep -E -o "[0-9]{2}\.[0-9]{2}\ fps" | grep -E -o "[0-9]{2}\.[0-9]{2}")
}

movie=$1

get_fps $movie
get_duration $movie

## use multi-cores of cpu to improve the speed of ffmpeg, see ffmpeg man page
cpu_cores=$(cat /proc/cpuinfo | grep processor | wc -l)

time ffmpeg -i $1 -r 1 -threads $cpu_cores image%d.png
time gm mogrify -resize 0.5%x100% *png
time gm convert $(for i in `seq 1 $movie_seconds`; do ls -l image$i.png; done | awk '{print $9}') +append result1.png
time gm convert result1.png -blur 50 result2.png

# resize result2.png with a proper size
# I set new width to 2000, while keep the height intact
new_width=2000
new_geometry=$(gm identify  result2.png | awk '{print $3}' | awk -F+ '{print $1}' | sed 's/[0-9]*x/2000x/g' | sed 's/$/!/g')
gm convert -resize $new_geometry result2.png result3.png

rm image*png

if [ -e $(which xdg-open) ]; then
    xdg-open result3.png
fi

代码逻辑很少,先是通过ffmpeg进行截图,然后用graphicsmagick进行图片的接合、缩放和模糊处理,最后清扫战场,删除一些临时文件,就这么简单。最后,奉上《迁徙的鸟》和《阿甘正传》的条形码,博君一笑。
迁徙的鸟_条形码

阿甘正传_条形码

geek之趣

有计算机就有码农,有码农就会用geek。穿着内衣坐在电脑前,每天面对着“枯燥的代码”,一如既往,这就是常人眼里的geek形象。殊不知,geek们自由geek自己的乐趣。比如linux就是一个叫做linus的geek无聊时的作品。

断续使用linux两年不到,学艺不精,不懂系统管理、不知道网络安全、不知道啥叫路由器网关,倒是对linux下面的一些小东西颇感兴趣,翻来覆去地折腾。本文权且列举一二,如果能帮助读者窥探到开源精神的一二,那可真是善莫大焉了。

  1. fortune:这个程序可以用来
    • 算命
    • 提高英文水平
  2. git-shell:git是一种分布式版本控制系统,git-shell是git工具中的一个命令。可能我们第一眼看上去会觉得git-shell一定是一个git的命令环境,我们进入git-shell,然后就可以在这个环境下敲各种各样的git命令,git-shell之于git,就相当于shell至于linux一样。而事实上,我们在shell中敲入git-shell,得到的确是:“fatal: What do you think I am? A shell?”,这语气好像是linus怒气冲冲地在审问你:“你是不是没有好好学习我的git系统,才会犯如此的错误!?”。查阅git-shell命令的manual,才知道原来git-shell不是一个shell,而是一个“Restricted login shell for GIT-only SSH access”。
  3. man PK woman:如果你不知道一个命令的作用或者你忘记了ls命令的某个参数怎么办?显然,用“男人(man)”命令查看“男人页(manual)”就行了。与此相对,编辑器的老大哥emacs是一个self-documenting的系统,linux的info系统就是基于emacs风格的key binding,为了将广大的“男人页”收归自己囊下,emacs“针锋相对”的搞了个“女人”——woman,美其名曰“to browse Unix manual pages 'W.O. (without) man'”。至于“woman”的来龙去脉,大家自己去参看emacs内部的info文档即可,或者看这里
  4. ffmpeg, hall of shame:ffmpeg是linux下面一个著名的多媒体处理软件。可以用来进行格式转换,视频的crop、padding,剪裁,编解码等等。ffmpeg同时提供了一套优质的多媒体编解码库,而良好的编解码库是一个播放器的基础。linux下的很多播放器都和ffmepg项目有密切的配合和依赖关系。ffmpeg是遵循GPL协议的,但是很多播放器“无耻地”使用了ffmpeg的代码,却没有遵循GPL协议开放自己的代码,因此就上了ffmpeg的“耻辱柱”……What a Shame!
  5. The Matrix:你是不是以为shell就是用来敲击命令而vim是用来编辑文件的?你看国《The Matrix》吗?事实上就有这么几个“无聊透顶”的人,为了让自己cool一些,抽出些无聊的时间写了几个无聊的程序——cmatrix and vim matrix plugin。借用vim的广告词——“linux,字符也可以如此精彩”。
  6. sl:如果统计一下linux用户中最常用的10个命令,ls、cd肯定是榜上有名。借助shell的智能补全功能,或许我们敲命令的出错率反而会比超短命令(ls、cd)的出错率还要低。比如ls命令,我们一不小心敲了个sl,还没等shell的补全反应过来,我们已经大大方方的敲了Enter,彻底了解了这一怨念。结果往往是“command not found”的沮丧和无奈。而偏偏有geek闲来无事,将这种沮丧和无奈变成了小小的火车,载走你的烦恼,造福子孙后代,功德无量也。
  7. emacs doctor:代码敲累了?心情不好了?外边又打雷下雨啦?网络莫名断掉了?……最近倒霉事连串,心里不爽是吧——没关系,来看看emacs的心理医生吧,让它陪你聊聊,24小时陪聊,而且还是免费的!type "M-x doctor",enjoy it!
  8. gimp naming problem:from gimp FAQ():
    • Q: Why and when was GIMP changed from "general image manipulation program" to "GNU image manipulation program"?
    • A: One day (I believe it was in 1997) RMS visited Berkeley, and Spencer and Peter met with him. They asked if they could change General to GNU, and it was done.
    • Q: GIMP is a stupid name. Why can't you change it?
    • A: GIMP is comfortable with its name and thinks that you should apologise for your rudeness.
  9. GNU
    • Q: What is GNU?
    • A: GNU is Not Unix.
                          (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @
                     (   )
                 (@@@@)
              (    )

            (@@@)
          ====        ________                ___________
      _D _|  |_______/        \__I_I_____===__|_________|
       |(_)---  |   H\________/ |   |        =|___ ___|      _________________
       /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
      |      |  |   H  |__--------------------| [___] |   =|                        |
      | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
      |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
    __/ =| o |=-~O=====O=====O=====O\ ____Y___________|__|__________________________|_
     |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
      \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

8月的总结

忙碌充实的一个月。第一周研究ffmpeg,转码脚本初步完成,转交给QA测试;4、5号两天周末去了上海;第二周回来研究继续DVDrip和蓝光DVD的初步研究,确立了转码标准,初步研究了字幕合并的问题;第三周听了taobao的一个性能测试培训,优化脚本的转换速度到原来的3倍,周四晚上奔上海呆了三天–睡了两天地铺……见了见几年没见的老同学dx(比我高一头却经常被我扁的小弟),lwc(挺投缘的朋友,这么久没见,我的第一句话是“是不是每个女生大学里的第一件事情就是把头发养长啊?“,然后就听见了L爽朗的笑声);第四周主要在研究字幕合并问题,接触了mencoder工具,由于首批收费视频要上线,所以几乎每天都加班,为运营提供技术支持–周三00:30离开公司、周四9:30离开、周五00:10离开公司、周六早9:00-12:00来加班,忙碌崩溃的一周,成果是http://hua.taobao.com/shop/shop_home.htm?sellerid=60&inshop=yes ,感觉一是做产品真的很不容易,二是念了这么多年书,终于能做出一些东西来,还是小有成就感的wink。上周日约了一批人去植物园游泳,四米深的池子,九个大老爷们集体跳水的景观还是挺壮观的;天色黑的时候,水底的灯光粼粼闪动、非常漂亮,虽然四米的水压压的我耳朵有些痛,我还是不断地潜下去体验–;我想到了Le grand bleu

技术上还是接触了很多新鲜的概念和名词,"I don't know I don't know" ==> "I know I don't know",在此一并罗列出来:

  • 视频转码方面:
  • Linux
  • Concepts
  • Networking
  • Software Performance Testing
    • 流程:评估、资源申请、计划、准备(环境+数据)、执行验证、调优、报告
    • 指标:虚拟用户和并发、TPS、PV(Page Viewer)、响应时间、CPU利用率、Load(Linux)、TPS波动值、JVM内存走势、FGC
    • 执行方案:单场景、混合场景、用户行为
    • 通过标准:超时概率、错误概率、TPS、TPS波动模型、CPU(大于75%不通过)、Load(每核CPU Load大于1不通过)、JVM、Full GC
    • 工具:Jconsole、Jprofile、Jstat、profiler、Jmap、Nmon、Valgrind、Vmap、VisualVM
  • Others
  • Delicious

翻完潦草不堪的Notebook,想想这一个月看的东西还真挺杂的。除了以上这些,中途走神看了看《大话设计模式》的前面几章;看了《Learning Python》的大部分–但是还没有动手写过程序……感觉书比较啰嗦,一个知识点反反复复的说来说去;看了w3cschool.cn的部分在线教程,重点看了JavaScript,边看边用Emacs Org-mode做笔记,还是挺好用的;阿里内网也有非常多宝贵的资源,上班时间没事,我自己下载了历年来各种培训资料、内部试题、新人手册大概300M左右,看了一半左右,留了个大概印象;看的过程中走神,不知道怎么就点到了Qcon Beijing 2009的网站,又发现了一个宝库,流着口水下载了所有能下的pdf–虽然大部分还看不懂……

除了以上,还有一些IT名人的反思、成长经历也给了我很大的启发:

代码看累了就会走神,偶尔拾到几个贝壳,抄录在本子上–一些话:

  • 我总希望有人在什么地方等我,你也总希望有人在什么地方等你吧(几米《照相本子》)。
  • 幸福的步道,总是那么短,我们可不可以赖着不走。
  • 这是八月初的一个早晨,美国南部的阳光舒迟而透明,流溢着一种久经忧虑的让人鼻酸的、古老而宁静的幸福(张晓风)。
  • 得意时便生失意之悲。
  • 其实不是时间在流失、流逝的是我们自己。
  • 不论怎么样,大家总是一年一年地来到这个路口,然后各自去闯荡(好像来自pluskid的diary)。
  • We had job, we had fun, we had seasons in the sun. But the hills that we climbed, were just seasons out of time.
  • 我的征途是星辰大海。
  • Do not spend all your time on training or studying - this way you will probably become very exhausted and unwilling to compete more. Whatever you do - have fun. Once you find programming is no fun anymore – drop it. Play soccer, find a girlfriend, study something not related to programming, just live a life - programming contests are only programming contests, and nothing more. Don't let them become your life - for your life is much more interesting and colorful.

另外一件小事就是最近总是肚子隐痛,去校医院查了查,做了个涕泪肆流的胃镜,诊断结果是浅表性胃炎,病因应该是幽门螺旋杆菌发炎。开了七八盒药,先吃着看吧。没敢告诉家里,怕家里担心。今天老妈还给我发短信说“我们在提车.东风日产.天籁2.0黑色.自动档.都下来奖金20万“,“在北京.如果你上班需要借给你开呵呵“–心头不自主地酸了一下:这么多年的风风雨雨,从前的老瓦房、大锅土炕、猪圈地窖,到自己的一套房子,到我考上唐山一中保送到浙大,到今天买上了自己的车,我那只有小学文化的母亲,何等不易!

肚子又开始痛了,也是,这么晚了,还不睡,伤身体的。

“宠辱不惊,闲看庭前花开花落; 去留无意,漫随天外云卷云舒“

我想人到最后追求的应该是一种淡定祥和的心态。风雨彩虹、日晒雨淋、雪山草地、高山大河、青灯古寺,或许我们本来就不需要手机,不需要SNS,不需要E-mail,不需要这种高速快节奏的生活。这种速度让人窒息、如同龙卷风一样,瞬息万变,让我们无法掌控自己。人与人之间的交流“贵在心诚,幸在投缘“,整天挂着QQ,好友遍地,却不知道什么时间该找谁说些什么话。我们再也没有提笔书信时的那种思考、没有等待书信时的那种期盼。信息泛滥,手机滴滴嗒嗒,我们在这头时刻准备着–接受别人的审判。这或许是对网络通讯世界的一种讽刺?

road

接下来的安排:9月第一周数模国家赛,三天三夜的拼搏;看完Python和JavaScript,重点看C++算法和Networking;关注各种校园招聘;10月第一周回家呆几天修整,学车考驾照;十一回来结束实习,全面投入找工作事宜,争取在年底搞定;如果有时间出去走走,可选地东北或者东南亚。Over,暂时这样。安。

一个人的自在

6月15日开始找实习,到了25日左右迎来了人生第一个offer——华数淘宝,待遇是60元/天+10元/天的晚餐票。找实习的过程很简短,百度和创新工厂预料之中的悲剧,DeviceVM莫名其妙的简短面试和之后的杳无音信,普联TP-Link的5分钟快餐面试,阿里一封没有下文的邮件、一个打到一半我手机却没电的尴尬电面、一个没有下文的快餐电话,以及来自上海紫竹科技园Intel的漫不经心的“聊聊“,还有十几封泥牛入海的邮件。两周不到,能拿到这个offer,也算是一个不错的结果了。至少这样的结果给了我信心,成绩差没关系,关键是自己有几斤几两。

而后就是无奈的期末考试,算不上奋力一搏,只是应付了事,弃了一门,挂了两门,剩下的几门70的、80的、90的各占三成。至此我的大学还剩下十门考试:

  1. 电路原理(重修)
  2. 线性代数(重修)
  3. 数字电子技术(重修)
  4. 编译原理
  5. 编译系统设计
  6. 计算机组成
  7. 计算机体系结构
  8. 计算机网路
  9. c#程序设计
  10. 软件体系结构

这样的结果,在我的同届预科生中应该算是很悲惨的了。至少很多同学由于多了预科半年的学习时间,到了大三下这个时候,已经完成了除了毕业设计外的全部学业,更有甚者,比如一位我只有过一面之缘的HDJ,已经提前一年毕业,拿了港大的offer——此mm是浙大李志文商学班的,同时也是浙大游泳队队员之一。对于这样的mm,除了客套的ym,更多的是一种敬仰吧——有规划有理想有追求并且能坚持不懈的做下去。

熬到7月6号,总算考完了最后一门——软件工程,在我看来是一门非常虚无非常飘渺的课程,其结果就是我只上过一次课,成绩也算对得起我的到课率了——68分——刚好达到浙大学位证最低成绩要求……

再之后是帮毕业的mm收拾寝室,给mm拍傻傻的学士服照片……12号早晨送走了mm,一个人去淘宝报道。没想到第一天报道也是一番纠结,首先是华数淘宝正式从淘宝剥离,从文二路淘宝公司内部搬到了紫荆花路府苑新村,然后我放下自行车导了三辆公交才到华数淘宝。第一天工作很简单,让我在windows上配置个trac,看看nginx服务器。都是从未听说过的东西。

我的理解,trac是个python语言写的svn前端+wiki的集合体,著名的c++ boost库用的就是trac,ruby也有类似的东西,叫redmine,当然,我对ruby一无所知,对python也仅仅是看过《Learning Python》的前两章,还出于ym的阶段。安装参考这篇How To Install Trac on Windows,其中有几个链接已经过时,需要自己手工下载安装。安装的过程还算顺利——比安装gentoo顺利多了。不过还是挺麻烦的——如果在linux下,一两条命令应该就可以了,也不用“鼠标点击——next——install“。

nginx是轻量级的http服务器,其功能或许不如apache全,但是性能却比apache强很多,尤其是在flv视频支持方面,其原理大概在于nginx针对不同的平台编码采用了不同的I/O模型。nginx的代码不算长,大概10w行左右,用c写成,所有的东西甚至包括./configure脚本都是作者手工写成,是一个锻炼阅读源码的好项目。国内的血多视频网站如youku、tudoo等后台服务器都是nginx。

第二天我就参加了小组会议,头儿给我讲了整个项目的架构和周期,听的我非常兴奋。大体思路就是我们要搭成一个全新的视频点播平台,做成中国的itunes app store。整个一周我都在了解各方面的信息,也对taobao这样的互联网公司有了进一步的了解。网上浏览的时候接触了很多“牛“的资源:

这些实际的项目、经验、团队、感想,感觉就在自己的身边,让我兴奋不已。阿里巴巴,马云,中国能有这样的企业,我觉得这是中国的未来。Open Source Never Die。

除了完成头给定的任务,我在网上快速的学习一些科普知识,各个方面的都有,很多东西扫一眼百度百科也比毫不了解要强,这些入门知识包括:

 吓到了吧?其实很多我都不会。我现在出于“我不知道我不知道“到“我知道我不知道“这样一个转变的过程。下一个目标是:“我知道我知道”。

除此之外,每个桌上那一抹绿色,厕所里的“蹲位以待“,中午和老总一起吃饭的气氛,自由宽松的工作环境时间,这些都是我喜欢的。不过日子久了,每天面对着电脑,看着一行行的字母滚动而过,不免麻木。每天晚上出了公司,抬头看看杭州最近让人淡定不能的天空,心里总有一些别样的悸动。

“我一个人吃饭、旅行,到处走走停停;也一个人看书、写信,自己对话谈心”,mm在上海入职培训,无暇顾我,我也就不再好意思打扰她。我告诫自己要忍让要懂得理解,千万不要因为这样的事情跟mm生气,如果连这点小事都忍受不了,以后又该如何支持mm的工作?我这样自我安慰,mm却不太理解,怪我对她的事情逐渐冷漠,搞得我伤心不已。

“你喜欢这个啊,你喜欢玩所有的毛绒玩具,你喜欢妈妈,喜欢爸爸,喜欢你的小睡衣。你什么都喜欢,是不是?知道吗?等你长大了,曾经喜欢的东西也许会变得不 再特别,就像这个玩偶盒,你会发现那只是一片铁皮加一个人偶,那些原本钟爱的东西会渐渐被你遗忘,到了我这个年纪,钟爱的东西也许只剩下一两件了,对我来 说只剩一件了。”《拆弹部队》,James对他的女儿说完这些,又独自回到了战场。

我这个人是个有点“无趣”的人,我不喜欢电脑游戏,什么dota、星际,我觉得要学会这些比修一门电路原理还难;我也不喜欢追星,我觉得谁当选了世界足球先生谁谁拿了NBA总冠军与我没啥关系,听说世界杯决赛在夜里两点,设了一点的闹钟,结果闹钟响了我按了继续睡……;我觉得一大群人去KTV去杀人游戏玩三国杀绝大多数时间也是纯属无聊找点消遣,阿桑还说:“孤单是一个人的狂欢,狂欢是一群人的狂欢”;我在校内上很低调,因为我觉得那里很浮躁,每天去看看无非就是了解下朋友的动向;所谓朋友,多数时候只是在特定的时间特定的地点和特定的环境下的朋友,到了人生关口,大家各奔东西,所谓友情也被岁月冲淡,我觉得真正的朋友不需要经常的联系来保持朋友关系,但现实中大多数的朋友需要经常联系保持这种朋友关系,这或许就是贺岁短信的终极目的吧。

所以说人生得一知己死而无憾。“什么?你了解我?笑话,我自己都不了解我,你会了解我?”

每个人都是孤独的行者。

人生在世,所谓何求?

所谓成长,就是信仰一个个崩塌的过程?

当有人要教育你的时候,你一定要提高警惕!

我们的教科书告诉我们要正视历史、以史为镜,可是广电却封杀了《活着》、封杀了《蓝风筝》、封杀了《颐和园》,这就是所谓“以史为镜”?

我们的社会主义赋予人所谓言论自由集会自由,同时我们的社会主义也用GFW提前给我们确定了考试范围和作文题目——我不要这种阉割的自由,我是个成年人,你凭啥单方面的决定哪些东西我该看哪些东西我不该看?

我们的党告诉我们只有共产党才能就中国,国民党的老巢台湾也没比大陆差到那里,真是一句屁话,我认为大学生盲目入党是中国当代大学生最大的悲哀。

其实有时想想,我们到底有没有必要那么执着?我们执着的入党出国学习深造进入名企做什么电子商务网游平台SNS,可是我们的国民却有很多人上不起学吃不起饭不知道电脑为何物。

欲望是痛苦之源。

我最近关注豆瓣上一个同城的活动:我们一起去流浪动物救助基地做义工吧,看了土豆网上一个视频,我开始思考佛教,审视素食主义。我想去基地做些事情,可是两次都睡过了。我开始思考李连杰,重温他的《霍元甲》;我看了《甘地传》,思考着爱因斯坦的那句话:“后代子孙将无法相信,世上曾活生生的出现过这号人物”;我想到了感动中国颁奖台上徐本禹滚滚而下的两行泪水;我想到了丛飞之死;我想到我的朋友db,放弃了学业,“抛弃了一切”,去做他“想做的事情”:

我想到了陆川的《可可西里》;我想到了雀儿山口常年护路的道班战士,想到了青海湖边那个没有电的小镇。

没有什么能够阻挡,你对自由的向往

天马行空的生涯,你的心了无牵挂

穿过幽暗的岁月,也曾感到彷徨

当你低头的瞬间

才发现脚下的路

心中那自由的世界

如此的清澈高远

2008.5 青海湖

2008.8 四川甘孜

请叫我们:行者。

CLI派视频音频转码工具用法小结(ffmpeg)1

1 ffmpeg 264编码支持

2 ffmpeg 参数选项简要说明

2.1 main options

  • -i filename: 指定输入文件
  • -y: Overwrite output files
  • -target: Specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", … ). All the format options (bitrate, codecs, buffer sizes) are then set automatically. It is one of the most useful options of ffmpeg. It instructs ffmpeg to just "do what it takes" for the target file to be usable.

2.2 视频剪辑相关参数

  • -ss: 设定剪辑开始时间[支持[hh:mm:ss[.xxx]]格式
  • -t: 设定剪辑长度[支持[hh:mm:ss[.xxx]]格式
  • -fs: 设定文件大小限制

2.3 video options

  • -b bitrate: 设定比特率(默认为200kb/s)
  • -r fps: frame rate(默认为25)
  • -s size: set frame size
    • wxh(width x height) or
    • abbreviations(qcif(176x144), vga(640x480), wvga(852x480)
  • -aspect aspect: 设定aspect ratio(4:3, 16:9, 30:9, 1:3 or 1.333, 1.777 etc.)
  • -sameq: use same video quality as source (implies VBR).
  • -vcodec: codec: force video codec to codec. Use the copy special value to tell that the raw codec data must be copied as is.
  • -newvideo: add a new video stream to the current output stream.
  • -pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
  • -map inputstreamid[:syncstreamid]: Set stream mapping from input streams to output streams.
  • -itsoffset offset Set the input time offset in seconds. "[-]hh:mm:ss[.xxx]" syntax is also supported. This option affects all the input files that follow it.

2.3.1 crop options(视频剪裁选项说明)

  • -crop x:y:width:height: Crop the input video to x:y:width:height.
  • -croptop
  • -cropbottom
  • -cropleft
  • -cropright

2.3.2 pad and filter options

  • -vf filter_graph
  • -vf pad=width:height:x:y:color(这个命令可以给裁剪后的视频增加上下两个pad,形成电影似的效果)

2.4 audio options

  • -ar freq: set the audio sampling frequency(default=44100Hz)
  • -ab bitrate: 设定比特率(默认为64K)
  • -aq q: set the audio quality
  • -ac channels: set the number of audio channels(default=1)
  • -acodec codec: force audio codec to codec. Use the copy special value to specify that the raw codec data must be copied as is.
  • -newaudio: add a new audio track to the output file. If you want to specify parameters, do so before -newaudio (-acodec, -ab, etc..).

2.5 subtitle options

  • -scodec codec: force subtitle codec ('copy' to copy stream).
  • -newsubtitle: add a new subtitle stream to the current output stream.

2.6 disable options

  • -an: disable audio recording.
  • -vn: disable video recording.
  • -sn: disable subtitle recording.

2.7 frames

  • -dframes number: set the number of data frames to record
  • -vframes number: set the number of video frames to record
  • -aframes number: set the number of audio frames to record

2.8 preset files

  • -vpre
  • -apre
  • -spre
  • -fpre

3 ffmpeg 用法示例(see http://www.catswhocode.com/blog/19-ffmpeg-commands-for-all-needs for more examples)

  • Basic Usage: ffmpeg [input options] -i [input file] [output options] [output file]
  • Normally the minimum one should specify in an ffmpeg command line would be something like: ffmpeg -i INFILE -acodec ACODEC -ab 96k -vcodec VCODEC -b 500k OUTFILE …replacing the capitalised values as appropriate. When using x264, we need to add some extra bits as the defaults are bad.
  • Getting infos from a video file: ffmpeg -i video.avi
  • Turn X images to a video sequence: ffmpeg -f image2 -i image%d.jpg video.mpg
  • Turn a video to X images: ffmpeg -i video.mpg image%d.jpg
  • Extracting sound from a video, and save it as Mp3: ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
  • Convert .avi video to .mpg: ffmpeg -i video_origine.avi video_finale.mpg
  • Convert .avi to animated gif(uncompressed): ffmpeg -i video_origine.avi -pix_fmt rgb24 gif_anime.gif
  • Mix a video with a sound file: ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
  • Compress .avi to VCD mpeg2 NTSC format: ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
  • Multi-pass encoding with ffmpeg: ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
  • Crop top 30 pixels and bottom 30 pixels to get a new video file: ffmpeg -i input_file.flv -croptop 30 -cropbottom 30 -target ntsc-dvd -aspect 16:9 output_file.mpg
  • Delaying the audio or the video: ffmpeg -i input1 -itsoffset 00:00:03.5 -i input2 ………..

4 ffmpeg learning resources

5 Related tools

5.1 transcode

5.2 mencode(from mplayer)

6 yamdi给视频增加关键帧

  • Yet Another MetaData Injector, see http://yamdi.sourceforge.net/
  • options:
    • -i: 输入文件
    • -o: 输出文件
    • -x: An XML file with the resulting metadata information.
    • -l: Adds the onLastSecond event(?).
  • other tools:
    • flvtool2: written by Ruby, slow, need more memory
    • flvmdi: not open source

7 ffmpegthumbnailer截取视频的thumbnail

  • ubuntu: sudo apt-get install ffmpegthumbnailer
  • options:
    • -i<s>: input file
    • -o<s>: output file
    • -s<n>: thumbnail size (default: 128)
    • -q<n>: image quality (0 = bad, 10 = best) (default: 8) (only for jpeg)
    • -c<s>: override image format (jpeg or png) (default: determined by filename)
    • -t<n|s>: time to seek to (percentage or absolute time hh:mm:ss) (default: 10%)
    • -a: ignore aspect ratio and generate square thumbnail
    • -f: create a movie strip overlay

8 Youku的一些探索

  • Youku网站上的大部分视频都是分段的,一般每段视频在5-10分钟之内
  • 目前Youku网上的视频格式大概有三种:
    • 高清mp4格式(h264编码)
    • 高清flv格式(h264编码)
    • 普通flv格式(应该是h263编码)

Author: Lox Freeman <xiaohanyu1988@gmail.com>

HTML generated by org-mode 6.21b in emacs 23




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee