用Android NDK编译FFmpeg错误解决

2023-10-29

转载:http://abitno.me/compile-ffmpeg-android-ndk

编译出来只有15k,后来借鉴这篇文章:http://www.cnblogs.com/shaobin0604/archive/2011/08/05/2128619.html成功,期间有一个错误在Android.mk中遗忘了一个依赖文件rtpdec_gxx忘了,根据错误提示解决。

首先创建一个标准的Android项目vPlayer

android create project -n vPlayer -t 8 -p vPlayer -k me.abitno.vplayer -a PlayerView -t android-16

然后在vPlayer目录里

mkdir jni && cd jni
wget http://ffmpeg.org/releases/ffmpeg-0.6.tar.bz2
tar xf ffmpeg-0.6.tar.bz2 && mv ffmpeg-0.6 ffmpeg && cd ffmpeg

在ffmpeg下新建一个config.sh,内容如下,注意把PREBUILT和PLATFORM设置正确。另外里面有些参数你也可以自行调整,我主要是为了配置一个播放器而这样设置的。

(不同的ndk版本,PREBUILT PLATFORM armelf.x crtbegin.o crtend.o 路径不同)

#!/bin/bash

PREBUILT=/home/toddmi/SDK/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PLATFORM=/home/toddmi/SDK/android-ndk-r8b/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-linux-androideabi-gcc-4.4.3 \
	--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
	--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
	--extra-cflags="-fPIC -DANDROID" \
	--disable-asm \
	--enable-neon \
	--enable-armv5te \
	--extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtbegin.o $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtend.o -lc -lm -ldl"

运行config.sh开始configure

chmod +x config.sh
./config.sh

configure完成后,编辑刚刚生成的config.h,找到这句

#define restrict restrict

Android的GCC不支持restrict关键字,于是修改成下面这样

#define restrict

编辑libavutil/libm.h,把其中的static方法都删除。(删掉static即可)

分别修改libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale下的Makefile,把下面两句删除

include $(SUBDIR)../subdir.mak
include $(SUBDIR)../config.mak

在ffmpeg下添加一个文件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))

接下来要添加一系列的Android.mk,在jni根目录下的内容如下

include $(all-subdir-makefiles)

在ffmpeg目录下,Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

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)

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)

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)

最外层的jni/Android.mk和jni/ffmpeg/Android.mk我只是随便这样写的,你应该根据自己的需求改写。

最后运行ndk-build,经过漫长的等待就编译完成了。至于具体怎么应用可能以后会写,我变得太懒了。。。

编译时出现undefine refence “xxxxx“,问题在Amdroid.mk文件编译规则引用文件没有加全。


我已经尽最大努力写明白了,希望大家努力啊,一个全功能的解码器或者只是播放器还是很有必要的。

更新:想偷情的可以看这个在Android NDK中使用libffmpeg.so


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Android NDK编译FFmpeg错误解决 的相关文章

  • 如何使用 ffmpeg 设置默认流

    我有一些 m4v 文件 我想用 ffmpeg 添加字幕 我知道我需要映射流以将它们放入输出文件中 但如何确保此字幕流将是默认流 字幕是 srt 人们似乎说它们与 mp4 容器不兼容 我需要先将字幕转换为什么 另外 各种流的顺序重要吗 视频流
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 如何在 RTMP 流中嵌入 pic_timing SEI 挂钟时间码?

    我需要将我的桌面流式传输到 AWS MediaLive 服务 并且根据要求 我必须在流中包含挂钟时间码 AWS 支持人员善意地通知我 对于 h 264 编码流 我需要提供时间码作为 pic timing SEI 消息 我在 Windows
  • ffmpeg计算视频比特率

    我想知道如何计算该视频的比特率 http jell yfish us media jellyfish 30 mbps hd hevc mkv http jell yfish us media jellyfish 30 mbps hd hev
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 以 Gif 形式在 Android 上以编程方式共享 WhatsApp 视频

    我如何将 mp4 视频文件转换为 WhatsApp gif 文件 在应用程序 UI 中简单显示为 gif 但内部是特定的 mp4 格式 以在 android 共享意图中使用 并被 Whatsapp 聊天应用程序识别为此类媒体 我搜索了很多
  • 使用 ffmpeg 将 mp4 转换为 gif 时帧率较低

    我正在使用 ffmpeg 将高质量视频转换为 gif 大多数视频都是 60fps 及以上720p 但是当我使用下面的代码将视频转换为 gif 时 我得到的 gif 输出的 fps 非常低 usr bin env palette tmp pa
  • ffmpeg 将 m4s 转换为 mp4

    我正在研究 DASH 试图为最终用户优化 QoE 我有一个视频 并使用 ffmpeg 将其编码为不同的比特率 一切都很好 并且可以使用 dash 播放该视频 我想要的是将用户收到的片段合并为一个 m4 并将该 m4 转换为 mp4 我在 f
  • ffmpeg 命令行,用于使用 Windows 7 从 Decklink 卡捕获(和录制)720p 音频和视频

    我正在尝试使用 Windows 7 720p 从 blackmagic Decklink 捕获卡捕获音频和视频 但我似乎无法正确获取 ffmpeg 命令行设置 ffmpeg list devices true f dshow i 虚拟 ds
  • 如何将H264封装到mp4容器中?

    我有一个程序生成一堆原始 H264 帧 并希望将其放入 mp4 容器中进行流式传输 有人知道该怎么做吗 我想我会使用 ffmpeg 然而 这需要商业使用 而且 ffmpeg 似乎只能通过它的 x264 库来做到这一点 它使用 GPL 许可证
  • 如何获取视频时长(以秒为单位)? [复制]

    这个问题在这里已经有答案了 如何获取以秒为单位的视频时长 我尝试过的 ffmpeg i file flv 2 gt 1 grep Duration Duration 00 39 43 08 start 0 040000 bitrate 38
  • 为 Windows Phone 8 构建 ffmpeg

    我如何为 Windows Phone 8 arm 构建 ffmpeg 我找不到任何有关它的信息 我可以在 Windows Phone 8 中从 C 调用 h 264 硬件编码器 解码器吗 看来媒体基金会太有限了 谢谢 据我所知 由于缺少工具
  • 在 Mac 操作系统上使用 ffmpeg 录制视频

    我想在 mac OS 上使用 ffmpeg 以任何格式录制实时网络摄像头视频 我尝试了很多 但无法找到用于重新编码视频的命令 所以请任何人都可以告诉我 ffmpeg 命令用于使用 Mac 操作系统的网络摄像头捕获视频 提前致谢 对于 Mac
  • 如何在 FFMPEG 中的多个视频之间创建交叉淡入淡出过渡?

    我目前正在通过 FFMPEG 循环播放带有音频的 MP4 视频 这是代码 del intermediate1 ts del f txt echo file intermediate1 ts gt f txt echo file interm
  • 从图像创建视频时,每秒减慢 ffmpeg 的图像速度

    我有一系列演示的屏幕截图 我想将其放入视频中 我正在使用 ffmpeg 为此目的 命令是ffmpeg f image2 i screenshot 5d png vcodec mpeg4 demo avi 不过 视频长度比我想要的要短 而且移
  • 如何使用从 CMSampleBufferRef (AVFoundation) 获取的数据填充音频 AVFrame (ffmpeg)?

    我正在编写用于将实时音频和视频从网络摄像头流式传输到 rtmp 服务器的程序 我在 MacOS X 10 8 中工作 因此我使用 AVFoundation 框架从输入设备获取音频和视频帧 该框架进入委托 void captureOutput
  • python中ffmpeg的管道输入和输出

    我在用着ffmpeg从我通过管道传输的 Base64 编码图像列表创建视频ffmpeg 输出到文件 使用下面附加的代码 工作得很好 但我想要实现的是将输出改为Python变量 意味着管道输入和管道输出 但我似乎无法让它工作 我当前的代码 o
  • 如何构建 FFMPEG 并将其链接到 iOS?

    all 我知道 这里有很多关于 iOS 上的 FFMPEG 的问题 但没有一个答案适合我的情况 当我尝试在项目中链接 FFMPEG 时 每种情况都会发生一些奇怪的情况 所以请帮助我 我的任务是为 iOS 编写视频聊天应用程序 该应用程序使用
  • 从可打开的 URI 将本机 fd int 传递到 FFMPEG

    我正在尝试从打开一个文件描述符CATEGORY OPENABLE来自存储访问框架的 URI 我首先尝试使用 SD 卡上的文件 我已经可以使用以下命令将其解析为文件路径 data列并打开 我试图避免这样做 而是使用文件描述符 我得到的原生 i

随机推荐

  • C# 关于运算符重载--矢量之间的运算

    运算符重载就是指重写 1 1 中的加号 那样我们可以实现1 1 1 类似的 其他运算符重载也是这样的道理 然运算符的重载用来干这些事显得鸡肋了些 更多的是 通过运算符重载去实现一般的加减乘除不能实现的运算 例如 gt 矢量的加减乘除 cla
  • 数据分析及算法总结

    一 K 近邻算 工作原理 简洁的讲 如果一个样本在特定的空间中的K个最邻近的中的大多数属于某个类 则这个样本属于这个类 用途 k近邻的目的是测量不同特征值与数据集之间的距离来进行分类 样本差异性 欧式距离 优缺点 优点 精度高 对异常值不敏
  • Vue-后台返回excel文件流,前端怎么处理

    导出Excel公用方法 export function exportMethod data axios method data method url data url data params data params responseType
  • 总结:多线程集合类java.util.concurrent.*

    目录 一 java util concurrent Java并发工具包 二 阻塞队列BlockingQueue 2 1 BlockingQueue用法 2 2 BlockingQueue的方法 2 3 BlockingQueue的实现 2
  • 利用dlib和opencv建立人脸识别数据集并进行人脸识别

    文章目录 一 dlib和opencv建立 二 人脸图像采集并储存 三 采集并保存特征值建立数据集 四 计算均值 五 总结 六 参考链接 一 dlib和opencv建立 请移步 基于dlib库实现人脸特征值提取 二 人脸图像采集并储存 采集2
  • element-ui实现动态菜单栏 并处理菜单栏折叠文本不隐藏问题

    element ui实现动态菜单栏 并处理菜单栏折叠文本不隐藏问题
  • html毛玻璃效果代码,纯CSS实现底层毛玻璃效果(代码示例)

    本篇文章给大家带来的内容是关于纯CSS实现底层毛玻璃效果 代码示例 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 毛玻璃背景是一个很常见的网页样式 想要实现 其实并不难 但经过我在网上的搜索发现 大量实现方法都较为不规范 且
  • go版本升级

    Window版本的go升级 首先到Go语言中文网下载windows对应的go版本 此处将go升级到1 18 版本 直接下载安装 安装之前会提示卸载旧版本 确定后直接安装在原来的Go安装目录 直接覆盖 安装成功后 在终端输入go versio
  • oracle优化中的常用语句

    查看session使用数 或者称建立的连接数 select count from v session 1 2 查看oracle锁 SELECT substr v lock sid 1 4 SID substr username 1 12 U
  • 专利与论文-6:《专利权利要求书》的撰写与注意事项

    前言 专利权利要求书 在对于专利而言 怎么说它的重要性都不过分 它直接关系到你的专利的权利在哪里 当发生专利侵权的时候 如何保护自己的利益 如果说 专利权利说明书 是专利的技术性文档 那么 专利权利要求书 就是法律性文档 它定义了 哪些技术
  • prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径 本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法 并使用 webpack 进行实现 Link 的链接类型 标签的 rel 属性可以定义链接类型 pref
  • 60黑马QT笔记之SQLite

    60黑马QT笔记之SQLite 1 与MYSQL的区别 1 SQLite是本地数据库 不需要和MYSQL一样需要连接 2 插入时不支持自动增长 所以主键例如id 在输入时需要自己去控制 3 使用时需要先提前建好后缀为xxx db的文本文件
  • ubuntu 20.04安装开发环境总结_安装python

    Ubuntu 20 04 是一款主要面向开发人员的操作系统之一 与此同时 它还支持多种开发环境和工具的使用 但是因为对市面上各种软件的支持没有window那样友好 所以对ubuntu系统安装配置各种环境的问题做了个总结 安装 PyCharm
  • C/C++入门秋招知识点八股文

    1 C C 关键字 1 1 static 静态 变量 在C中 关键字static是静态变量 静态变量只会初始化一次 然后在这函数被调用过程中值不变 在文件内定义静态变量 函数外 作用域是当前文件 该变量可以被文件内所有函数访问 不能被其他文
  • 38.求解简单表达式。输入一个形式如“操作数  运算符  操作数”的四则运算表达式,输出运算结果,要求使用switch语句编写

    38 求解简单表达式 输入一个形式如 操作数 运算符 操作数 的四则运算表达式 输出运算结果 要求使用switch语句编写 include
  • 高速缓存(cache)原理

    高速缓存 cache 概念和原理 cache基本思想 cache 存储器 Cache memories 在处理器附近增加一个小容量快速存储器 cache 基于SRAM 由硬件自动管理 cache基本思想 频繁访问的数据块存储在cache中
  • 前端和后端终极学习视频(百度网盘资料)

    1 ps 链接 https pan baidu com s 1mjYbcJA密码 pqdt2 HTML5 CSS3从入门到精通 iso链接 https pan baidu com s 1mjYbcJA密码 gdyw3 Javascript视
  • 视频去抖动稳像总结

    下面转载了两篇别的文章 都是传统算法做的 后面将会持续更新 原文链接 https blog csdn net update7 article details 107864986 1 背景 点播 直播行业的蓬勃发展 使用户生产视频 UGC 逐
  • 使用sqoop命令报错ERROR mapreduce.ExportJobBase: Export job failed ERROR tool.ExportTool: Error during exp

    如图所示 仔细查看错误信息会发现有下面一条 2022 07 10 20 17 39 786 INFO mapreduce Job Job job 1657447073157 0042 running in uber mode false 2
  • 用Android NDK编译FFmpeg错误解决

    转载 http abitno me compile ffmpeg android ndk 编译出来只有15k 后来借鉴这篇文章 http www cnblogs com shaobin0604 archive 2011 08 05 2128