基于Ubuntu交叉编译FFmpeg Windows SDK
写在前面
FFmpeg是一个开源且跨平台的音视频解决方案,集采集、转码、流式化为一身,项目的libavcodec编解码模块和libavformat媒体格式模块,支持非常非常丰富的编解码格式和容器封装格式,是做媒体相关开发工作必须要掌握和借鉴的一个项目。定制和编译ffmpeg是做流媒体开发迟早要面对的,linux平台上相对简单,windows平台就比较麻烦了。本文的目的就是详细介绍下如何基于ubuntu交叉编译环境,编译和定制ffmpeg。
一 概述
ffmpeg主要是基于linux开发,当然它也支持windows,不过并不支持visual studio系列IDE(因为它使用了大量C99特性,而vs不支持C99),所以要想在windows上使用,必须要通过mingw或cygwin来编译,或者在linux上构建windows交叉编译环境,后者要简单些。这里有个网站http://ffmpeg.zeranoe.com/,作者提供了ffmpeg已经编译好的windows版本,包括静态连接的,动态连接的,以及sdk,基本上隔几天就编译一次。大家可以先上去看一下,如果它编译的符合你的需求(上次看的时候它好像没有加入libfaac,现在不知道了),而你又懒得编译,就可以使用它的。对linux不太熟悉的朋友可能不太想继续往下看,请不要担心,ubuntu的安装和使用非常简单,直接在虚拟机里使用就行。编译的时候,你也只需要使用几个很简单的命令而已。
二 环境准备
1. Ubuntu Linux,本人使用的Ubuntu 11.10,安装在VMware Workstation中
2. MinGW编译环境,我们要非常感谢,zeranoe,它做了一个自动下载和编译ffmpeg所需要的mingw及其他工具链的脚本,请到http://ffmpeg.zeranoe.com/blog/下载最新的“MingGW-w64 Build Script 2.8.2”。解压后新建一个目录把它放进去(本人的目录是/home/haibindev/studio/mingw-w64/),然后打开终端,cd 到MinGW-w64所在目录,执行"chmod +x mingw-w64-build-2.8.2",使这个脚本可以执行。之后运行"./mingw-w64-build-2.8.2",就可以按照提示来做了。如果它提示你缺少依赖库,就按照它的提示先安装依赖库,方式是,执行"sudo apt-get install 库名字"。

3. 设置终端的环境变量
执行一下命令即可。(注意,如果你关闭了终端,或者新建一个终端,需要重新执行一下这个命令。)
export PATH="$PATH:/home/haibindev/studio/mingw-w64/mingw-w64-i686/bin"
三 下载FFmpeg源码和你需要的编解码库的源码
这点不用做什么介绍,先到ffmpeg官网,下载ffmpeg源代码,然后再Google你需要的编解码库,到相关网站下载即可。本人这次编译共下载了以下代码,以做大家参考。
libx264 libfaac libmp3lame libopenjpeg libogg libspeex libvorbis libtheora libxvid ffmpeg
下载完后解压,然后统一放到一个目录中,本人的目录是/home/haibindev/studio/opensource/。下图是全家福(build-ffmpeg是编译ffmpeg的工作目录,下面介绍,freetype我没有编译)。

四 编译
为了方便,我把所有库编译后的结果都存放到了一个统一的目录/home/haibindev/opensdk,方法请见下面的编译命令。
除了第一个命令以外,其余的都是configure命令,执行完之后,还需要执行make命令,然后执行make install。我就不再写出来了。
1. 先执行以下命令
ln -s "/usr/bin/pkg-config" /home/haibindev/studio/mingw-w64/mingw-w64-i686/bin/i686-w64-mingw32-pkg-config
2. libx264
./configure --enable-static --enable-win32thread --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --cross-prefix=i686-w64-mingw32-
3. libfaac
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --with-mp4v2=no
4. libmp3lame
CFLAGS=-DFORCEINLINE= ./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-frontend
5. libopenjpeg
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared
6. libogg
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared
7. libspeex
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest
8. libvorbis
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest
9. libtheora
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared --disable-oggtest --disable-vorbistest --disable-sdltest --with-ogg-includes=/home/haibindev/opensdk/include --with-ogg-libraries=/home/haibindev/opensdk/lib
10. libxvid
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --disable-pthread
11. ffmpeg
先创建/home/haibindev/studio/opensource/build-ffmpeg,然后cd到该目录,执行
../ffmpeg-0.8.7/configure --disable-static --enable-shared --enable-version3 --enable-gpl --enable-nonfree --disable-pthreads --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-cross-compile --target-os=mingw32 --arch=x86 --prefix=/home/haibindev/opensdk/ffmpeg --cross-prefix=i686-w64-mingw32- --extra-cflags="-I/home/haibindev/opensdk/include" --extra-ldflags="-L/home/haibindev/opensdk/lib"
注意,编译xvid时需要先编辑configure文件,然后删除里面的“-mno-cygwin”字段,否则make会失败,提示-mno-cygwin无效。libmp3lame命中中最前面的“CFLAGS=-DFORCEINLINE= ”是为了防止mp3lame中的一个编译错误,要记得带上。
以上编译成功之后,ffmpeg win32 sdk就出现在/home/haibindev/opensdk/ffmpeg里面了,bin目录下就是我们需要的所有文件了。

五 验证编译后的程序
拷贝到windows上,在命令中运行ffmpeg.exe,看

验证一下,做个转码操作就行了,执行
ffmpeg.exe -i s.avi -vcodec libx264 -acodec libfaac s.mp4
运行正常,生成了264编码和aac编码的,mp4文件,播放正常,ok了。

六 最后说一下
请大家编译的时候千万别忘了configure之后,要执行make和make install!另外,一定要看清楚我贴出来的命令,把我的目录,换成你的目录,不要直接拷贝,那是不行的,因为你不叫haibindev:)。如果有的库在make的时候出现了编译错误,简单修改一下源文件就能搞定。
ffmpeg有很多配置选项,你可以对它深度定制,可以把avcodec编译得很小,大家可以自己研究。
基于Ubuntu交叉编译FFmpeg Windows SDK的更多相关文章
- vmware虚拟机下ubuntu 13.04使用zeranoe脚本交叉编译ffmpeg
2013-07-01今天是建党节,习总书记指出,党的建设要以“照镜子.正衣冠.洗洗澡.治治病”为总要求.希望我们的党越来越纯洁,为人民谋福利.言归正传,每次项目中需要编译相应的ffmpeg,都很费时费 ...
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 基于Ubuntu 14.04 LTS编译Android4.4.2源码
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS ...
- 基于Ubuntu 14.04 LTS编译Android4.4.2源代码
转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 【计算机视觉】深度相机(八)--OpenNI及与Kinect for windows SDK的比较
OpenNI(开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API.OpenNI API由一组可用来编写通用自然交互应用的接口组成.OpenNI的主要目的是要形成一 ...
- Kinect for Windows SDK 1.8的改进及新特性
今年3月, 微软推出了Kinect for Windows SDK 1.7 更新,包括了手势识别 Kinect Interactions 和实时 3D 建模 Kinect Fusion 两项新技术. ...
- 基于Ubuntu虚拟机安装edx-platform
基于Ubuntu虚拟机安装edx-platform 一. 前提准备 1. 虚拟机中安装Ubuntu12.04,然后再使用Vagrant方式搭建开发环境,请确保这个虚拟机可以使用2GB的内存,否则容 ...
- Kinect for Windows SDK开发入门(15):进阶指引 下
Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...
- ubuntu下ffmpeg的安装,实现支持3gpp等转换
最近上线的项目,语音格式转码需要调试3gpp,所以需要再spx,3gpp,3gp等格式之间转换,特记录基于ubuntu环境下的环境ffmpeg部署细则 安装测试环境:ubuntu 14.04 64bi ...
随机推荐
- Linux中的提示符
root的提示符:# 一般用户的提示符:$
- Android 禁止状态栏下拉
同学项目用到Android 禁止状态栏下拉,我也迷茫,网上很多资料都不行,最终找到了下面一篇博客,感觉很不错,说的比较详细,供大家参考了 http://blog.csdn.net/u011913612 ...
- 石子合并DP
DP Time Limit:3000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit Status Pra ...
- EasyDSS流媒体解决方案实现的实时数据统计报表、视频文件上传、点播、分享、集成代码等功能
之前的EasyDSS作为rtmp流媒体服务器自从推出就备受用户好评,随着用户的需求的变更产品自身的发展是必须的: 为了更好的用户体验和和功能的完善,我们在EasyDSS的基础上增添了服务器硬件数据报表 ...
- http => https 升级
准备证书 阿里云安全(云盾)-> CA证书服务,购买证书,个人测试的话可以使用免费的,期限1年. 购买证书后,把域名与证书进行绑定,提交审核,大概10分钟左右,正常情况下审核就可以通过.证书准备 ...
- wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流
一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...
- 九度OJ 1000:计算a+b
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:35767 解决:15660 题目描述: 求整数a,b的和. 输入: 测试案例有多行,每行为a,b的值. 输出: 输出多行,对应a+b的结果. ...
- linux下查找指定时间内修改过的或新建的文件
1.简单命令 # find -type f \( -newermt '2017-04-19 00:00' -a -not -newermt '2017-04-27 23:59' \) 2.简单实现(参 ...
- 在VS2017环境中编译libxml2库
libxml2库编译 1.下载libxml2,官网是:http://www.xmlsoft.org/downloads.html, 我下载的版本是:libxml2-sources-2.9.7.tar. ...
- Card Collector(期望+min-max容斥)
Card Collector(期望+min-max容斥) Card Collector woc居然在毫不知情的情况下写出一个min-max容斥 题意 买一包方便面有几率附赠一张卡,有\(n\)种卡,每 ...