ffmpegandroid编译
㈠ 如何运行从Android的命令行的ffmpeg
在前面编译FFmpeg类库编译ffmpeg时,编译脚本中使用了参数 –disable-ffmpeg,所以是不会生成ffmpeg工具的,即使生成了,
在Android应用下也无法直接使用。
但是,FFmpeg 命令行是十分强大易用的,我们可以用命令行完成大部分的需求,So,Let’s Do it.
http://blog.csdn.net/chengkaizone/article/details/52984091
㈡ 如何用Android NDK编译FFmpeg
Android NDK编译FFmpeg
配置编译环境
在 VirtualBox 中创建一个 Ubuntu 虚拟机
在 Ubuntu 虚拟机中使用 sudo passwd root 命令启动 root 账户
用 root 账户登录进入 Ubuntu
将 android-ndk-r4b-linux-x86.zip 中的内容解压缩到 /root 目录下
将 android-sdk_r07-linux_x86.tgz 中的内容解压缩到 /root 目录下
将 ffmpeg-0.6.1.tar.bz2 中的内容解压缩到 /root/ffmpeg/jni 目录下
三、准备编译 FFmpeg
编写 mk 文件
在 /root/ffmpeg/jni 目录中创建一个 Android.mk 文件,内容如下
?1include $(all-subdir-makefiles)
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目录中创建一个 Android.mk 文件,内容如下
6LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil
libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目录中创建一个 av.mk 文件,内容如下
# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or
libswscale
#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch
-Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=/"config-$(TARGET_ARCH).h/"
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))
ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif
C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))
FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))
在 /root/ffmpeg/jni/ffmpeg-0.6.1/libavcodec 目录中创建一个 Android.mk 文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
在 /root/ffmpeg/jni/ffmpeg-0.6.1/libavformat 目录中创建一个 Android.mk 文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
在 libavfilter、libavutil、libpostproc 和 libswscale 目录中各创建一个 Android.mk
文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
修改 libm.h 文件和 Makefile 文件
编辑 /root/ffmpeg/jni/ffmpeg-0.6.1/libavutil 目录中的 libm.h 文件,删除以下 static
方法
#if !HAVE_LRINT
static av_always_inline av_const long int lrint(double x)
{
return rint(x);
}
#endif /* HAVE_LRINT */
#if !HAVE_LRINTF
static av_always_inline av_const long int lrintf(float x)
{
return (int)(rint(x));
}
#endif /* HAVE_LRINTF */
#if !HAVE_ROUND
static av_always_inline av_const double round(double x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUND */
#if !HAVE_ROUNDF
static av_always_inline av_const float roundf(float x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUNDF */
#if !HAVE_TRUNCF
static av_always_inline av_const float truncf(float x)
{
return (x > 0) ? floor(x) : ceil(x);
}
#endif /* HAVE_TRUNCF */
编辑 libavcodec、libavfilter、libavformat、libavutil、libpostproc 和 libswscale
目录中的 Makefile 文件,删除
?1include $(SUBDIR)../subdir.mak
和
?1include $(SUBDIR)../config.mak
生成 config.h 文件
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目录中创建一个 config.sh 文件,使用 Android NDK r4b
编译时内容如下
#!/bin/bash
PREBUILT=/root/android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0
PLATFORM=/root/android-ndk-r4b/build/platforms/android-8/arch-arm
./configure --target-os=linux /
--arch=arm /
--enable-version3 /
--enable-gpl /
--enable-nonfree /
--disable-stripping /
--disable-ffmpeg /
--disable-ffplay /
--disable-ffserver /
--disable-ffprobe /
--disable-encoders /
--disable-muxers /
--disable-devices /
--disable-protocols /
--enable-protocol=file /
--enable-avfilter /
--disable-network /
--disable-mpegaudio-hp /
--disable-avdevice /
--enable-cross-compile /
--cc=$PREBUILT/bin/arm-eabi-gcc /
--cross-prefix=$PREBUILT/bin/arm-eabi- /
--nm=$PREBUILT/bin/arm-eabi-nm /
--extra-cflags="-fPIC -DANDROID" /
--disable-asm /
--enable-neon /
--enable-armv5te /
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x
-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
使用 Android NDK r5 编译时内容如下
#!/bin/bash
PREBUILT=/root/android-ndk-r5/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86
PLATFORM=/root/android-ndk-r5/platforms/android-8/arch-arm
./configure --target-os=linux /
--arch=arm /
--enable-version3 /
--enable-gpl /
--enable-nonfree /
--disable-stripping /
--disable-ffmpeg /
--disable-ffplay /
--disable-ffserver /
--disable-ffprobe /
--disable-encoders /
--disable-muxers /
--disable-devices /
--disable-protocols /
--enable-protocol=file /
--enable-avfilter /
--disable-network /
--disable-mpegaudio-hp /
--disable-avdevice /
--enable-cross-compile /
--cc=$PREBUILT/bin/arm-eabi-gcc /
--cross-prefix=$PREBUILT/bin/arm-eabi- /
--nm=$PREBUILT/bin/arm-eabi-nm /
--extra-cflags="-fPIC -DANDROID" /
--disable-asm /
--enable-neon /
--enable-armv5te /
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x
-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
打开终端,进入 /root/ffmpeg/jni/ffmpeg-0.6.1 目录,运行下面的命令
㈢ android studio2.3 怎么编译ffmpeg
整体调用逻辑为:
1 编译完ffmpeg库
2 使用jni方式撰写c代码,其中需要包含相应的ffmpeg的头文件
3 撰写相应的Android.mk文件,里面指定需要编译的c代码以及需要链接的动态库
4 执行ndk-build生成相应的jni库
5 创建andorid java程序,代码中loadLibrary相应ffmpeg库以及刚才生成的jni库
6 静态方法声明native函数,这些函数在jni写的c语言中都已经实现过
㈣ 哪位高手做过ffmpeg在android下的运用.小弟我只想调用解码h264的帧
楼主你好!根据你的描述,让我来给你回答!
用NDK把ffmpeg 编译成动态库SO 文件
再android工程利用JNI生成接口调用这个静态库。
希望能帮到你,如果满意,请记得采纳哦~~~
㈤ 如何把ffmpeg移植到android
1
首先把系统环境配置好,一般情况系统默认都会安装gcc和make编译工具。若提示未安装编译工具,请使用sudo apt-get install build-essential安装即可。
2
修改编译后库的版本号,在ffmpeg目录下找到configure文件,将下图所示的4行代码修改为
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
3
将以下代码保存到build.sh中
#!/bin/bashNDK=/home/robot/tools/android-ndk-r8eSYSROOT=$NDK/platforms/android-14/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64
function build_ffmpeg{./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffserver \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG}PREFIX=$(pwd)/androidADDI_CFLAGS="-marm"build_ffmpeg
4
使用命令修改build文件的属性
chmod a+x build.sh
5
接下来就是执行build.sh文件,"."表示当前目录
./build.sh
执行成功后,会生成config.h配置文件
6
开始编译,
make
make install
执行成功会在Android目录下生成一系列目录,bin、include、lib、share,生成的库就在lib目录下
㈥ ffmpeg交叉编译android,rtsp协议sdp流播放问题
pthread support is required
这个问题是交叉编译的时候你没开启pthread
也就是编译时加上
--enable-pthread
第二个问题不是问题是个警告或者提示
字面意思就是:从bitrate估算,可能不准确
㈦ ffmpeg 命令行 在android执行
对于ffmpeg我是彻底小白,昨天刚开始接触,就是按着网上的教程安装了MingGW和msys神马的一大堆,然后貌似编译出了可以用的ffmpeg。
现在的情况是:打开msys的DOS命令窗口,照着网上写的输入了几个简单的命令,能实现转换格式、截取某时刻的缩略图。这样说明ffmpeg是编译成功了吧?
【但是】我看网上关于ffmpeg的demo程序,都是很长很长的程序,应该是 .c 文档之类的,并不是在DOS命令窗口敲的命令。是应该用VS2010之类的,编辑这些长的程序然后运行么?如果是的话,具体怎么操作的呢?
还是说,这些程序只能在linux环境下运行?
今天费了好大的劲儿才把ffmpeg编译出来,但是由于对编程开发工具不熟悉(只会简单的码代码,编译运行..),引入头文件函数库神马的也都不太懂,实在是不知道怎么用。
身边很少有了解ffmpeg的,网上的信息也很零碎,自己入门实在是太困难了。。 但这是跟老师做的项目,不能不学。所以求各位大神多多指导,多谢了!
泪目~~T_T~~
㈧ 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 安卓移植的时候 编译和使用的工具链要一致吗
在经历了多次下载、实验、查看代码之后,终于在Android上移植上了 ,并且写了自己的jni wrapper,以下是对我帮助很大的几个帖子,列举出来,希望能够对大家有所帮助:转载