Archive

Posts Tagged ‘ffmpeg’

生成兼容 iPhone 和 PSP 的视频

June 17th, 2009 li No comments

iPhone 和 PSP 都支持播放 MP4 格式的视频。MP4 基于 Apple 的 QuickTime MOV 视频格式标准,是目前支持度最高的一种视频格式,多数的手机和移动设备,在播放 MP4 视频的时候都具有硬件优化。

但 iPhone 和 PSP 支持的视频要求略有不同。在视频转换的时候,如果不加以注意,生成的视频往往只能在一种设备上播放。

这给同时具有PSP、iPod Touch 和 PC 机的我带来很大的视频管理难题:同样一部影片,需要下载、保存三份:PSP、iPhone,再加上 PC。不但浪费空间,浪费下载带宽和时间,而且考虑到现在 MP4 视频的下载没有像 HDTV、DVDRip 那样成熟的下载渠道,更是加剧了这方面的困难。

如果可以生成 MP4 视频,使得 PSP,iPhone/iPod Touch,还有电脑(显然)都可以播放,就可以一举解决这个问题。

为了完成上述目标,我用 ffmpeg 写了一个转换脚本(用文件名替换%1)。生成的 MP4 文件属性如下

  • 分辨率:480×272。这是 PSP 和 iPhone 都能播放的最高分辨率。(其实两种设备都支持 640×480 分辨率,但该分辨率下,无法保证 PSP 和 iPhone 都兼容)
  • 视频编码:420kbps H.264。
  • 音频编码:16位双声道,64kbps
  • PSP 兼容参数:refs=2 (PSP 最多支持两个参考帧)
  • iPhone 兼容参数:coder=0 bf=0 flags2=-wpred-dct8x8 (iPhone 不支持熵编码,不支持 B 帧)
ffmpeg -i %1 -r 25 -threads 2 -s 480x272 -y -vcodec libx264 -an -pass 1  -flags +loop -cmp +chroma -partitions -parti8x8-parti4x4-partp8x8-partp4x4-partb8x8 -me_method dia -subq 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -directpred auto -trellis 0 -level 21 -coder 0 -bf 0 -flags2 -wpred-dct8x8 -refs 2 -b 420k -bt 420k -ab 64k -ar 48000 -ac 2 -f mp4 pass1.tmp
 
ffmpeg -i %1 -r 25 -threads 2 -s 480x272 -y -vcodec libx264 -acodec libfaac -pass 2 -flags +loop -cmp +chroma -partitions +parti8x8+parti4x4+partp8x8+partb8x8 -me_method umh -subq 8 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 2 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -directpred 3 -trellis 1 -level 21 -coder 0 -bf 0 -flags2 -wpred-dct8x8 -refs 2 -b 420k -bt 420k -ab 64k -ar 48000 -ac 2 -f mp4 %1.mp4
Categories: 开源软件 Tags: , , , ,

Debian 下编译静态链接的 ffmpeg 版本

March 24th, 2009 li 1 comment

ffmpeg 是一款开源视频编码转换工具,最近刚刚发布 0.5 版本。ffmpeg 支持 h264,mpeg4,aac,mp3,等多种视频音频编码格式,同时支持 avi,mp4,mov,flv 等多种 container 格式。

Debian 中源中自带 ffmpeg,由于版权问题,只支持很少的几种编解码器,功能非常弱,可用性比较差。Debian Multimedia 项目弥补了这一缺陷,提供了预编译好的支持各种常用格式的 ffmpeg。

由于 Linux 发行版对于动态链接库的使用情有独钟,喜欢用链接到 Shared Object(so)库的方式编译各种软件,Debian 自然也不例外。而 ffmpeg 这款博览各家之长的软件拥有众多的库依赖关系,因此不能单独安装。不同发行版之间,甚至相同发行版的不同版本号之间,ffmpeg 的安装包都是不兼容的。安装起来非常不方便。

花了一周末的时间,使用 Debian 成功编译出静态链接的 ffmpeg 版本,得到脚本如下。下载后在 Debian 中直接运行即可。我在当前 Debian Multimedia 的 ffmpeg-0.5.svn20090318,和 Sid,Squeeze,Lenny 上测试该脚本成功。如果软件下载速度太慢,请自行修改脚本中的 Debian 源 URL。

另外,我用 Intel C Compiler 编译了 ffmpeg 的静态版本,只能运行在 Cuo 2 Duo 之后的芯片上。简单测试了一下,mpeg4 编码大概能比 gcc 版本快 10% 左右。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#/bin/sh
cat > /etc/apt/sources.list.d/build-static-ffmpeg.list <<EOF
deb http://debian.ustc.edu.cn/debian sid main contrib non-free
deb-src http://debian.ustc.edu.cn/debian sid main contrib non-free
 
deb http://debian.ustc.edu.cn/debian-multimedia sid main
deb-src http://debian.ustc.edu.cn/debian-multimedia sid main
EOF
apt-get update
apt-get -t sid install debian-multimedia-keyring debian-archive-keyring
 
mkdir -p nvidia-glx-dev/DEBIAN
cat > nvidia-glx-dev/DEBIAN/control <<EOF
Package: nvidia-glx-dev
Priority: optional
Maintainer: nobody@example.com
Architecture: all
Version: 180.29
Description: dummy package for nvidia-glx-dev
 dummy package for nvidia-glx-dev
EOF
 
dpkg-deb -b nvidia-glx-dev
dpkg -i nvidia-glx-dev.deb 
 
apt-get -t sid build-dep ffmpeg || ( apt-get -t sid install libsdl1.2-dev && apt-get -t sid build-dep ffmpeg )
apt-get -t sid install libusb-1.0-0-dev
 
apt-get -t sid source ffmpeg
 
cd ffmpeg-*/
 
cat > static_build <<EOF
debian/rules clean
debian/rules patch
 
CFLAGS="-Wall -g"
CC="ccache gcc"
NCPUS=\$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1)
 
./configure \
	--disable-ffplay --disable-ffserver --disable-shared --enable-static \
	--extra-libs="-static -ldirac_encoder -ldirac_decoder -lstdc++ -lspeex -lvorbis -lxvidcore -ldc1394 -lraw1394 -lusb-1.0 -lm -lasound -ldl" \
	--prefix=/usr --extra-cflags="\$CFLAGS" --cc="\$CC" \
	--libdir=\\\${prefix}/lib --shlibdir=\\\${prefix}/lib --bindir=\\\${prefix}/bin \
	--incdir=\\\${prefix}/include/ffmpeg --enable-libmp3lame \
	--enable-gpl --enable-libfaad --mandir=\\\${prefix}/share/man --enable-libvorbis \
	--enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc \
	--enable-libamr-nb --enable-libamr-wb --enable-x11grab --enable-libgsm \
	--enable-libx264 --enable-libtheora --enable-libdc1394 \
	--enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac \
	--disable-decoder=libdirac --enable-libschroedinger --disable-encoder=libschroedinger \
	--enable-libspeex --enable-avfilter-lavf --disable-mmx \
	--disable-altivec --disable-armv5te --disable-armv6 --disable-vis
 
echo "#define FFMPEG_VERSION \"SVN-r18029-static\"" > version.h
 
make -j \$NCPUS && echo Build success || echo build failed
strip ffmpeg
 
./ffmpeg -version
cp ffmpeg ..
EOF
 
. static_build 
echo Type ". static_build" under source code dir to rebuild
Categories: 开源软件 Tags: , ,