ffmpeg编译源码
① ffmpeg源码是c还是c++
是c语言开发的。教你一种办法,查看库函数等的源码方法。
网络进入github网站,搜索ffmpeg,找到源码。查看文件类型。
如图
就知道是c语言开发的了
② Ubuntu 环境 编译 ffmpeg移植android 的问题!
到FFmpeg官方网站http://www.ffmpeg.org/上去下载源代码,这里下载的源代码是最权威的。进入官网之后,选择”Download”进入下载页面,截止2014年3月28日止,最新的发布的稳定版本为FFmpeg2.2,代号”Muybridge”。选择该下方的”Downloadgzip tarball”进行下载,下载后的文件名为ffmpeg-2.2.tar.gz,大约8.3M。
第二步:在linux环境下编译FFmpeg
在Windows平台可以采用VMplayer虚拟机上安装ubuntu的方式,本人也是采用这种方式。
本文以/home/dennis为根目录进行操作和说明:
将ffmpeg-2.2.tar.gz拷贝至根目录,然后执行如下解压命令将其解压:
$tar zxf ffmpeg-2.2.tar.gz
解压后将得到/home/dennis/ffmpeg-2.2目录。
③ 请教ffmpeg在centeOS 64位下的编译问题
软件安装
(1). MinGW+Msys安装
下载MSYS,解压到E:/ffmpeg64/msys目录。
下载MinGW-w64,解到E:/ffmpeg64/msys/mingw64目录。
启动msys.bat,打开类似于Linux的终端,并导入mingw64的环境变量。
echo 'export PATH=.:/local/bin:/mingw64/bin:/bin' > .profile
source .profile
(2). SDL安装
下载SDL1.2.14,解压到E:/ffmpeg64/SDL-1.2.14目录。
进入SDL-1.2.14目录,依次执行:
./configure --host=x86_64-w64-mingw32
make
make install
编译过程中,出现如下错误:
④ 如何将FFmpeg源码编译一个so库
我们从上篇文章 FFmpeg编译 知道,正常打出来的有5个so包,当然有它的好处是按需引入。但是如果都需要,那是不是觉得很多呢?那可不可以打出一个so呢?答案是当然可以,下面以armv7-a平台为例,脚本如下。
其实在上篇 FFmpeg编译 中脚本的基础上添加如下即可打出一个so包:
编译完成大概需要几分钟。
android/armv7-a下生成一个ffmpeg.so
libffmpeg.so及相应的同文件到工程里就好
⑤ 怎么修改ffmpeg里面的源码,让它实现流共享
while (1) {
AVPacket pkt;
// 不知道pkt是否完整
ret = av_read_frame(f->ctx, &pkt);
if (ret == AVERROR(EAGAIN)) {
av_usleep(10000);
continue;
}
if (ret < 0) {
av_thread_message_queue_set_err_recv(f->in_thread_queue, ret);
break;
}
}
FFMpeg不提供接口,那么就只有修改FFMpeg源码,浏览FFMpeg源码一天后,对外的接口只需要在AVPacket结构体里面增加一个判断包完整性的标志变量,修改源码后的接口调用如下:
while (1) {
AVPacket pkt;
ret = av_read_frame(f->ctx, &pkt);
if (pkt.nLostPackets) {
// Do something.
} else {
// Do something
}
}
⑥ FFmpeg之Linux下编译与调试
下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行
基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语句如下:
依赖库分两方面,参考以下网站列出的依赖库信息,本文选择的版本均参考于此网页: FFmpeg依赖库信息
首先创建 FFmpeg 代码目录,所有的源代码放在这个目录下
FFmpeg 编译之后,即可使用。编译生成的可执行程序在 ~/bin 目录下
注:上面的 ./configure 配置编译后并不能进行调试,需要如下配置.
刚才的工程可以运行,但不能debug。解决此问题,首先认定一点,生成的可执行程序中,ffmpeg 不包含调试信息,调试信息在 ffmpeg_g 中,debug 要选择 ffmpeg_g。
另外,./config选项也是确定包含调试信息的核心,需要在config中添加:
采用以下命令重新config:
一些注意事项; 在使用 ffplay 播放生成 h264 格式的视频时,播放速度会加快,解决方式:不要使用 FFmpeg 转码生成纯 h264 格式的视频,要使用一种容器包含 h264 视频,即生成一种音视频流格式,也就是不要生成纯粹的 h264 码流,而是生成诸如 mkv 等格式的文件。
⑦ iOS-FFmpeg实现简单播放器(编译fak-aac+x264+sdl)
本文介绍自己编译sdl2,fdk-aac,x264,ffmpeg源码集成到Xcode工程中,其中fdk-aac,x264嵌套编译进ffmpeg中,并使用sdl播放音频,OPenGLES渲染视频实现简单播放器
若报错 fdk-aac-2.0.2/configure: No such file or directory ,则用我网盘袜吵磨中的解压文件,里面包含了configure执行文件,执行 ./告斗build.sh 后,
修改build-ffmpeg.sh文件为最新的版本4.3.2,修改CONFIGURE_FLAGS值中增加禁止生成可执行文件ffmpeg,ffplay,ffprobe,fdk-aac需要增加--enable-nonfree选项,fdk-aac和x264文件绝对路径要一致
将编译好的sdl,fdk-aac,x264,ffmpeg头文件和库文件(include和lib文件夹)
导入Xcode工程中并设置Header Search Path为
导入依赖的库AVFoudation.framework,CoreMedia.framework,VideoToolBox.framework,AudioToolBox.framework,lbz.tbd,libbz2.tbd,libiconv.tbd
使用ffmpeg库获取ffmpeg版本号
集成后可使用ffmpeg进行软解码,sdl播放音频碰源,OpenGLES绘制视频实现一个简单播放器
开启子线程读取到MP4文件后,从MP4文件中解封装出h264文件和aac文件分别解码为YUV原始视频帧和pcm原始音频,将解封装出来的h264文件放入_vPktList,aac文件放入_aPktList
SDL通过回调的方式开启子线程播放音频
配置参数可精简和优化ffmpeg,在ffmpeg目录中,终端执行./configure --help列出全部参数
⑧ 如何使用ndk编译ffmpeg静态库
如何使用ndk为ffmpeg编译rtmp+polarssl静态库?这个问题花了我整整一天时间。其中遇到很多小问题,这里记录一下,方便自己也方便其他人。
1、编译polarssl,查看其Readme文件即可,不需要configure,只需要make时带上必要的参数即可,不过要记得在每一次执行make命令时都带上CC的参数(指向你的arm gcc),因为我试过在make install时没有带上CC的参数,虽然能编译出polarssl但是未能正确被rtmp引用到。
2、因为前面我用的polarssl是当前最新(1.3.7)版本,而librtmp使用的好像是polarssl1.0.0以下版本的api,所以需要修改rtmp部分源码,让其调用新版polarssl的api,这里的修改可以参照《Migrating from PolarSSL-1.2 to the PolarSSL 1.3 branch》和《[rtmpmp] branch master updated. a312ac7 Fix compat with PolarSSL >= 1.1.0》。
3、出现 undefined reference to `havege_random’错误,这里是因为polarssl默认关闭了havege模块,需要你手动开启,主要就是修改include/polarssl/config.h,去掉POLARSSL_HAVEGE_C前的注释,也就是要定义POLARSSL_HAVEGE_C,如下:
#define POLARSSL_HAVEGE_C
4、在编译出上面两个库之后,可以开始编译ffmpeg(2.1.1版本)了,如果遇到下面的问题 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
ERROR: librtmp not found
这里有三种解决方法:
第一种,因为是网络上传播最多的,算是比较简便的方法,就是修改ffmpeg的configure,将以下一行:
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
改为:
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz
或者直接注释掉&& *** 部分,然后再自己加上librtmp的库路径也行
第二种,(比较推荐,因为解决了这个会顺带解决大部分找不到库的错误!)因为这里使用了pkg-config工具查找库,而这个工具ndk并没有附带提供,而出现check_pkg_config相关错误的话,只要稍加注意,会发现在使用configure配置ffmpeg的交叉编译时,已经有相应的pkg-config不存在的警告了。我对这个工具不熟悉,所以我只是简单地加上了一个软链接到系统的pkg-config,如下:
ln -s /usr/bin/pkg-config /home/cidy0106/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config
这个时候重新configure的话可能会出现找不到polarssl库的错误提示,需要修改一下librtmp安装目录里的librtmp.pc,把以下内容:
Libs: -L${libdir} -lrtmp -lz
改为:
Libs: -L${libdir} -lrtmp -lz -lpolarssl
至此,就可以正确编译出ffmpeg了
转载