安卓编译x264与集成使用ffmpeg-demo

下面的都是错误的存在问题

编译安卓下面的x264巨坑
首先是Found no assembler 错误,
那么就百度方案两种;将 --disable-asm 添加到命令行,或者安装nasm。坑的开始,我想着还是安装上怕之后有东西不支持,所以就去下载高版本的NASM,然后解决了Found no assembler 问题
https://www.cnblogs.com/wanggang123/p/8660435.html 解决Found no assembler
https://blog.csdn.net/ByChen623/article/details/53616126 Ubuntu上安装NASM

然后巨坑来了 No working C compiler found 问题
首先百度方案是说ndk配置路径得到root路径并配置到环境变量,这一部分可以最后通过ndk-build验证是否配置成功,

在这里插入图片描述
但是还是一直报错
后来又找到https://www.itdaan.com/blog/2015/07/08/7ec37909141e3f276671374788380a2a.html X264移植android问题记录(No working C compiler found)
说加入 --disable-asm但是还是不行,一直提示错误。

因为尝试了很多个网上的configure配置,最后偶然的一次 我加入 --disable-asm的没有加\的连接符突然成功了,可以进行make有目标文件夹创建了,
在这里插入图片描述

建议先./configure 配置 网上很多直接一个脚本make makeinstall那么就会打印很多信息而没有看到错误,但是又没有目标文件夹的出现,一直有问题并且当前目录生成的libx264.a是linux的x264而不是用ndk编译出来的安卓版本的。

一些参考网上的实践参数
在这里插入图片描述

#!/bin/bash
ANDROID_NDK=/opt/ndk/android-ndk-r19c
SYSROOT=$ANDROID_NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64


function build_one
{
	./configure \
	--prefix=$PREFIX \
	--enable-static \
	--disable-gpac \
	--disable-asm \
	--disable-cli \
	--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
	--host=arm-linux \
	--sysroot=$SYSROOT \
	--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
	--extra-ldflags="$ADDI_LDFLAGS" \
	$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""

build_one

最后实践参数 两种安卓架构的一起生成

#!/bin/bash
ANDROID_NDK=/opt/ndk/android-ndk-r19c
ADDI_CFLAGS=""
configure()
{
    CPU=$1
    PREFIX=$(pwd)/android/$CPU
    HOST=""
    CROSS_PREFIX=""
    SYSROOT=""
    if [ "$CPU" == "armv7-a" ]
    then
        HOST=arm-linux
        SYSROOT=$ANDROID_NDK/platforms/android-21/arch-arm/
        CROSS_PREFIX=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
    else
        HOST=aarch64-linux
        SYSROOT=$ANDROID_NDK/platforms/android-21/arch-arm64/
        CROSS_PREFIX=$ANDROID_NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
    fi
	./configure \
	--prefix=$PREFIX \
	--enable-static \
	--disable-gpac \
	--disable-asm 
	--disable-cli \
	--cross-prefix=$CROSS_PREFIX \
	--host=$HOST \
	--sysroot=$SYSROOT \
	--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
	--extra-ldflags="$ADDI_LDFLAGS" \
	$ADDITIONAL_CONFIGURE_FLAG
}

build()
{
    make clean
    cpu=$1
    echo "build $cpu"

    configure $cpu
    #-j<CPU核心数>
    make -j4
    make install
}

build arm64
build armv7-a

整体参考链接:https://blog.csdn.net/bobcat_kay/article/details/88843778

上面的都是有问题的,交叉编译工具链都指定存在问题,因群友指教以及公众号的文章重新编译,已成功编出。脚本如下。自动修改相关路径

编译X264

#!/bin/bash
export NDK=/opt/ndk/android-ndk-r19c # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=21

function build_android
{
./configure \
    --prefix=$PREFIX \
      --disable-cli \
    --disable-shared \
    --enable-static \
    --enable-pic \
    --host=$my_host \
      --cross-prefix=$CROSS_PREFIX \
    --sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \

make clean
make -j8
make install
}

#arm64-v8a
PREFIX=./android/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android

#armeabi-v7a
PREFIX=./android/armeabi-v7a
my_host=armv7a-linux-android
export TARGET=armv7a-linux-androideabi
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
build_android

编译带x264的ffmpeg

#!/bin/bash
export NDK=/opt/ndk/android-ndk-r19c # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

function build_android
{

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--disable-postproc \
--enable-static \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-nonfree \
--enable-muxers \
--enable-decoders \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$X264_INCLUDE" \
--extra-ldflags="-L$X264_LIB" 

make clean
make -j8
make install
echo "The Compilation of FFmpeg with x264,fdk-aac for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

BASE_PATH=/home/aston/androidFFmpeg
LIB_TARGET_ABI=arm64-v8a


#指定 x264 的头文件和静态库目录
X264_INCLUDE=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/lib
build_android

cp $X264_LIB/libx264.a $PREFIX/lib

#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

BASE_PATH=/home/aston/androidFFmpeg
LIB_TARGET_ABI=armeabi-v7a
X264_INCLUDE=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264-stable/android/$LIB_TARGET_ABI/lib

build_android

cp $X264_LIB/libx264.a $PREFIX/lib

参考链接:
https://mp.weixin.qq.com/s/Gbqq7yYKGQxQpCk5WYI2_Q FFmpeg、x264以及fdk-aac 编译整合
https://mp.weixin.qq.com/s/5U6la1GdHf1I0E7Vaa7dIw FFmpeg 编译
https://blog.csdn.net/zhongjianblackberry/article/details/106897411 FFmpeg一键编译Android arm64位和32位共享库(armeabi-v7a arm64-v8a)

安卓集成ffmpeg静态库(Android.mk)方式

参考链接:
https://blog.csdn.net/Plx0303sunny/article/details/103494365 Android工程中使用FFMPEG静态库(CMake和Android mk) (注意在我这里实践的时候mk需要多链接一些库,不然调用ffmpeg函数的时候报错)
https://mp.weixin.qq.com/s/7pBjoVGDl_zGDwWWBOhkmg Android NDK 开发之 CMake 必知必会
(没有实践成功所以暂时采用mk的方式编译so来提供jni使用)

相关文件内容(注意建立native C++工程)
在这里插入图片描述
Android.mk

#Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avfilter
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := x264
LOCAL_SRC_FILES := ${TARGET_ARCH_ABI}/libx264.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := \
                native-lib.cpp
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES := avfilter avformat avcodec avutil swresample swscale x264
LOCAL_CPPFLAGS:=-std=c++11
LOCAL_LDLIBS += -landroid -llog -lGLESv2 -lz -lOpenSLES

include $(BUILD_SHARED_LIBRARY)

Application.mk

#Application.mk
APP_ABI := armeabi-v7a
APP_STL := c++_static

FFmepgRecord .java

package com.example.androidffmepgrecord;

public class FFmepgRecord {
    static {
        System.loadLibrary("native-lib");
    }

    public static String GetFFmpegVersion() {
        return stringFromJNI();
    }

    /**
     * A native method that is implemented by the 'androidffmepgrecord' native library,
     * which is packaged with this application.
     */
    public static native String stringFromJNI();
}

build.gradle
在这里插入图片描述

补充一条ubuntu下ndk编译安卓so的问题

Ndk编译提示Input/output error错误

原因:在共享文件夹下编译会存在问题,复制到虚拟机本地就可以了。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值