无法将 FFmpeg C 库移植到 android 中

2023-12-28

我到底想要做什么:访问ffmpeg.c文件来修改int main(int argc, char **argv)功能为JNI并将 ffmpeg 命令作为字符串传递。

我尝试将 ffmpeg C 库移植到 android(ARM 处理器)。我遵循了不同的方法来做到这一点。

第一次尝试:使用官方 ffmpeg 安装文档。步骤如下

a) git 克隆 git://source.ffmpeg.org/ffmpeg.git ffmpeg

b) 阅读安装文件。

c) 下载 x264 库并使用以下命令进行构建构建_x264.sh哪个构建成功。

    NDK=/home/nav/Work/android/ndk
    PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt
    PLATFORM=$NDK/platforms/android-8/arch-arm
    PREFIX=/home/nav/28ffmpeg/android-ffmpeg                
    ./configure --prefix=$PREFIX --enable-static --enable-pic --disable-asm --disable-cli --host=arm-linux --cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- --sysroot=$PLATFORM
  make
  sudo make install
  sudo ldconfig

d) 然后我下载ffmpeg 库 from (http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2)通过使用来构建它build_android.sh

#!/bin/bash

NDK=/home/nav/Work/android/ndk
PLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PREFIX=/home/nav/28ffmpeg/android-ffmpeg

function build_one
                {
                ./configure --target-os=linux --prefix=$PREFIX \
                --enable-cross-compile \
                --enable-runtime-cpudetect \
                --disable-asm \
                --arch=arm \
                --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
                --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
                --disable-stripping \
                --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
                --sysroot=$PLATFORM \
                --enable-nonfree \
                --enable-version3 \
                --disable-everything \
                --enable-gpl \
                --disable-doc \
                --enable-avresample \
                --enable-demuxer=rtsp \
                --enable-muxer=rtsp \
                --disable-ffplay \
                --disable-ffserver \
                --enable-ffmpeg \
                --disable-ffprobe \
                --enable-libx264 \
                --enable-encoder=libx264 \
                --enable-decoder=h264 \
                --enable-protocol=rtp \
                --enable-hwaccels \
                --enable-zlib \
                --disable-devices \
                --disable-avdevice \
--extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
                --extra-ldflags="-L/home/android-ffmpeg/lib"
                make -j4 install

$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
                }

                build_one

e) 最初它工作得很好。但在那之后error来了:

libavformat/libavformat.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
libavutil/libavutil.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
build_android.sh: 48: build_one: not found

Result: libffmpeg.so未找到。

第二次尝试:然后我按照以下步骤操作http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html-> 构建

a) 我下载了预构建libffmpeg.so从上面的链接。

b) Add libffmpeg.so to 库/armeabi/ .

c) Make Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_STATIC_LIBRARIES += ffmpeg
LOCAL_SRC_FILES := ffmpeg-test.c
include $(BUILD_SHARED_LIBRARY)

d) 然后我完成所有 ndk 设置和所有操作。复制ffmpeg.c从图书馆到ffmpeg-测试.c通过改变其int main对我的功能JNI函数并包含所有必需的包含文件。

Error:

Console:

  /home/nav/Work/android/ndk/ndk-build all 
Prebuilt       : libffmpeg.so <= jni/
Install        : libffmpeg.so => libs/armeabi/libffmpeg.so
Compile thumb  : main <= ffmpeg-test.c
jni/ffmpeg-test.c: In function 'print_report':
jni/ffmpeg-test.c:1139:94: warning: incompatible implicit declaration of built-in function 'log2' [enabled by default]
SharedLibrary  : libmain.so
/home/nav/Work/android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/main/ffmpeg-test.o: in function check_keyboard_interaction:jni/ffmpeg-test.c:2496: error: undefined reference to 'qp_hist'

和许多其他未定义的参考。


https://github.com/guardianproject/android-ffmpeg https://github.com/guardianproject/android-ffmpeg

查看 git 上的这个项目,了解有关更改“ffmpeg.c.main()”的线索 我相信这个项目的构建将在自述文件中提到的 NDK 版本上正常工作。

Note:

您应该花一些时间了解 NDK 发行版中的所有文档文件,以便了解 make 的工作原理。

对于 android JNI 来说,“main()”函数的退出条件通常需要稍微改变。

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

无法将 FFmpeg C 库移植到 android 中 的相关文章

随机推荐

  • EF4 和连接字符串

    我有一个 3 层项目 1 项目 数据 EDMX文件 2 项目 模型 POCO的 3 Project Console 控制台应用程序 我已将连接字符串添加到Project Console
  • 如何使用 Tokio 远程关闭正在运行的任务

    我有一个正在接收数据的 UDP 套接字 pub async fn start gt Result lt std io Error gt loop let mut data vec 0 1024 socket recv from mut da
  • 2022年如何应对后台地理围栏?

    情况如下 当用户创建地理围栏时 我将其保存到后端并向操作系统注册地理围栏 但是每当我的应用程序重新启动时 我都会从后端获取地理围栏并再次在操作系统中重新注册它们 因为它们不断消失 我有两节课MainActivity and FormActi
  • 当 EB 环境为 python 3.6 时,使用 python 2.7 安装需求时出现 AWS 错误

    如何让 AWS EB 实例使用实例上已安装的 python 3 版本 我无法获得运行 Python 3 6 并运行 Django 2 1 的新环境 本地 不在虚拟环境中 which python gt usr local bin pytho
  • cucumber-testng 4.0 并行执行默认为 10 始终

    这是我的酷跑者 我试图通过重写 dataprovider 方法来使用 cucumber jvm 4 0 0 中内置的并行性 我看到我的场景是并行调用的 但线程数始终默认为 10 我尝试使用 threads 选项作为状态执行GitHub ht
  • 如何通过 SSH 连接到 Mac 容器中的 Docker [重复]

    这个问题在这里已经有答案了 我正在运行 Mac 版 Docker 版本 1 12 0 rc2 beta16 内部版本 9493 我已从本地存储库中提取了一个映像 并使用 docker run d 创建了一个容器 使用 docker ps 我
  • OllyDbg 中的左下窗格显示什么?

    我使用 NASM 组装了以下代码 global start section data var1 DD 0xA1A2A3A4 4 bytes var2 DD 0xB1B2B3B4 4 bytes section bss var3 RESD 1
  • 使用Officer 除了Word docx 之外还创建pdf

    我在循环中使用官员 过去使用记者 来创建 150 个独特的文档 然而 我需要将这些文档从 R 导出为 word docx 和 pdf 有没有办法将用officer创建的文档导出为pdf 这是可能的 但我的解决方案取决于 libreoffic
  • 使用 Alamofire/Codable 解析 JSON 行

    是否可以使用 Alamofire 和 codable 解析 JSON 行 这是我现在的代码 Alamofire request url method get parameters parameters encoding URLEncodin
  • 无法将属性“溢出”设置为 null

    webView getSettings setJavaScriptEnabled true webView加载这个html代码
  • 自动向下滚动聊天div

    我有这个代码 用于加载聊天 function getMessages letter var div messages get msg show php function data div html data setInterval getM
  • C++ 跨平台高分辨率定时器

    我正在寻找用 C 实现一个简单的计时器机制 该代码应该可以在 Windows 和 Linux 中运行 分辨率应尽可能精确 至少毫秒精度 这将用于简单地跟踪时间的流逝 而不是实现任何类型的事件驱动设计 实现这一目标的最佳工具是什么 更新了一个
  • 一个简单的java多线程

    嗯 我遇到了一个奇怪的问题 public class Test private boolean state new boolean false false public void createThread Thread th1 new Th
  • ng build -prod 与 ng build --prod --build-optimizer=true

    我的 Angular 项目是 Angular4 3 3 ng 构建产品 构建需要 77 秒 ng build prod build optimizer true 构建需要 190 秒 没有供应商块 大小更小 但大小差异不大 Chunk di
  • Angular2 - ContentChild 查询找不到嵌套组件

    我正在尝试设置一个 Angular2 组件 该组件自动聚焦通过内容投影插入的输入元素 我使用的解决方案基于这个答案 https stackoverflow com a 34503163 1592971 我还有一个额外要求 即输入元素可以嵌套
  • 如何检查服务器是否发送垃圾邮件?

    我今天检查了我的 IP 地址 因为我收到了退回的电子邮件 并且我发现它已被列入一些列表的黑名单 我只使用我的网站发送客户电子邮件 不发送时事通讯电子邮件 所以我不会发送很多电子邮件 我不知道为什么我的专用IP地址会被列入黑名单 有没有办法检
  • 如何检查是否安装了 .net for excel 互操作性

    我在代码中使用 net Primary Interoperability Assembly for Excel 但是 该应用程序可以在未安装 net PIA for Excel 的计算机上运行 我想如果没有安装就给出错误信息 即使我正在检查
  • FAILED_NOT_VISIBLE 负载平衡中 Google 管理的 SSL 证书

    我正在与负载平衡合作 将 https 连接到我的静态网站 并且我在 GoDaddy 中拥有我的域名 在初始阶段 我只有 Http 所以我用指向 c storage googleapis com 的 cname 绘制了我的域名 并用域名进行存
  • Google 地图 API 函数 map.getCenter()

    当用户调整地图时 我将 Google Map API 设置的缩放和位置保存在 cookie 中 当他们回来时 地图位于同一个地方 该函数大部分时间都有效 var h JSON stringify map getCenter null 2 j
  • 无法将 FFmpeg C 库移植到 android 中

    我到底想要做什么 访问ffmpeg c文件来修改int main int argc char argv 功能为JNI并将 ffmpeg 命令作为字符串传递 我尝试将 ffmpeg C 库移植到 android ARM 处理器 我遵循了不同的