轻松一刻:电影条形码转换脚本 - 行者无疆 始于足下 - 行走,思考,在路上

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

xiaohanyu posted @ Sun, 03 Feb 2013 20:09:47 +0800 in Shell with tags shell FFMpeg graphicsmagick , 3886 readers

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

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

是不是想动手尝试下了?可是有这样的软件吗?我没找到。于是唯一的办法就是自己动手,丰衣足食了。代码在这里,依赖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进行图片的接合、缩放和模糊处理,最后清扫战场,删除一些临时文件,就这么简单。最后,奉上《迁徙的鸟》和《阿甘正传》的条形码,博君一笑。
迁徙的鸟_条形码

阿甘正传_条形码

Andre said:
Sun, 17 Feb 2013 11:26:35 +0800

阿甘正传底部那个footer,想必是字幕吧?笑了。

Shihui said:
Sun, 03 Mar 2013 06:25:20 +0800

我是查latex cjk查到这的,结果看了其他几个帖子,发现越来越有意思,再看到后面,发现是PKU的,你是CS08?07?现在在哪呢?

我是YP06的,正在UK读博士,最后一年,做图形学,动画和影视特效

Avatar_small
Lox said:
Sun, 03 Mar 2013 10:13:52 +0800

呃,恕我孤陋寡闻,yp是?

我是ZJU07的,现在在一家小公司做OpenStack。

你的phd读的很快呀。

Shihui said:
Sun, 03 Mar 2013 17:39:20 +0800

那就是我误解了,恩,抱歉。你是当时在百度实习的时候在PKU待了半年?

YP是元培学院的意思,恩。英国这边的学制比较短,三到四年即可。有IM之类的?正好我想问下cloud computing这块,多谢了

Avatar_small
Lox said:
Sun, 03 Mar 2013 18:28:57 +0800

hi, 已经发邮件回复,请查收。

reverland said:
Wed, 27 Mar 2013 11:50:53 +0800

ZJU07,浙江大学07级……
你们对暗号么……

简搜博客 said:
Wed, 27 Mar 2013 13:23:39 +0800

博主 你咋不更新了?

市场调研 said:
Wed, 22 May 2013 14:44:21 +0800

好的文章可以振聋发聩!好的评论可以一针见血,楼主好文,必须收藏。我是一鸣SEO,记得回访!

cc98er said:
Thu, 23 May 2013 09:17:18 +0800

这网站老是访问不了的


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee