FFmpegAndroid icon indicating copy to clipboard operation
FFmpegAndroid copied to clipboard

原生库兼容16kb对齐

Open yuyingfeng1989 opened this issue 9 months ago • 8 comments

请问目前最新的demo有兼容到原生库16kb对齐吗,目前大部分都是采用原生库4kb对齐。

yuyingfeng1989 avatar Jul 04 '25 01:07 yuyingfeng1989

感谢你提的优化项,后续准备支持16k页内存

xufuji456 avatar Jul 05 '25 06:07 xufuji456

你好请问框架支持H265、H264转码吗,例如H265编码的AVI格式转MP4格式适用吗?

yuyingfeng1989 avatar Jul 15 '25 01:07 yuyingfeng1989

支持h264、h265解码,支持h264编码

xufuji456 avatar Jul 16 '25 06:07 xufuji456

请问转码avi格式视频到MP4格式,一直不成功,解码音频出错了,尝试了一些ffmpeg命令也都没能正常转码成功还是没能成功。 报错日志如下: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (? (?) -> aac (native)) Decoder (codec pcm_u8) not found for input stream #0:1 from native msg=Decoder (codec pcm_u8) not found for input stream #0:1 Conversion failed! 如果采用跳过所有音频流单独转码视频流命令能够正常转码; 请问需要怎样修改ffmpeg命令或更新某些库能兼容到音视频转码的好方式; 谢谢

yuyingfeng1989 avatar Jul 17 '25 10:07 yuyingfeng1989

ffmpeg 交叉编译支持 16kb page size:

ffmpeg 依赖 x264,所以要先交叉编译它:

mkdir ffmpeg-android
cd ffmpeg-android
git clone https://code.videolan.org/videolan/x264.git
cd x264

创建 build.sh :

#!/bin/bash

# ===== CONFIGURATION =====
NDK=/home/lingyunxiao/dev/android-sdk/ndk/21.4.7075529
API=28
# =========================

export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AR=$TOOLCHAIN/bin/llvm-ar
export LD=$TOOLCHAIN/bin/ld

./configure \
  --prefix=../arm64-v8a \
  --enable-static \
  --enable-pic \
  --disable-cli \
  --host=aarch64-linux-android \
  --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
  --sysroot=$TOOLCHAIN/sysroot \
  --extra-cflags="-fPIE -fPIC" \
  --extra-ldflags="-pie"

make clean
make -j$(nproc)
make install

echo "Build complete!"

执行 build.sh,完成后确认 ffmpeg-android/arm64-v8a 有 x264 相关的东西,比如 x264.h libx264.a 等。

接下来进入重点:

在 ffmpeg-android 同级目录下
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
切换到 release/6.0 分支

创建 build_ffmpeg_one.sh 文件:

#!/bin/bash
make clean
set -e
archbit=64

if [ $archbit -eq 32 ];then
  echo "build for 32bit"
  ARCH='arm'
  CPU='armv7-a'
  ABI='armeabi-v7a'
  API=28
  PLATFORM='armv7a'
  PLATFORM_ARCH='arm'
  ANDROID='androideabi'
  OPTIMIZE_CFLAGS="-march=$CPU -mfpu=neon -mfloat-abi=softfp -marm"
elif [ $archbit -eq 8664 ];then
  echo "build for x86_64bit"
  ARCH='x86_64'
  CPU='x86-64'
  ABI='x86_64'
  API=28
  PLATFORM='x86_64'
  PLATFORM_ARCH='x86_64'
  ANDROID='android'
  OPTIMIZE_CFLAGS="-march=$CPU -mfpu=neon -mfloat-abi=softfp"
else
  echo "build for 64bit"
  ARCH='aarch64'
  CPU='armv8-a'
  ABI='arm64-v8a'
  API=28
  PLATFORM='aarch64'
  PLATFORM_ARCH='arm64'
  ANDROID='android'
  OPTIMIZE_CFLAGS="-march=$CPU -mfpu=neon -mfloat-abi=softfp"
fi

uname=`uname`
if [ $uname = "Darwin" ];then
  echo "compile on mac"
  COMPILE_PLAT="darwin"
elif [ $uname = "Linux" ]; then
  echo "compile on linux"
  COMPILE_PLAT="linux"
else
  echo "don't support $uname"
fi

export NDK=/home/lingyunxiao/dev/android-sdk/ndk/21.4.7075529
export TOOL=$NDK/toolchains/llvm/prebuilt/$COMPILE_PLAT-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$COMPILE_PLAT-x86_64/bin
export SYSROOT=$NDK/toolchains/llvm/prebuilt/$COMPILE_PLAT-x86_64/sysroot
export CROSS_PREFIX=$TOOLCHAIN/$ARCH-linux-$ANDROID-
export CC=$TOOLCHAIN/$PLATFORM-linux-$ANDROID$API-clang
export CXX=$TOOLCHAIN/$PLATFORM-linux-$ANDROID$API-clang++
export PLATFORM_API=$NDK/platforms/android-$API/arch-$PLATFORM_ARCH
export PREFIX=../ffmpeg-android/$ABI
export PREFIX2=/usr/local
export ADDITIONAL_CONFIGURE_FLAG="--cpu=$CPU"

THIRD_LIB=$PREFIX
THIRD_LIB2=$PREFIX2
export EXTRA_CFLAGS="-Os -fPIC $OPTIMIZE_CFLAGS -I$THIRD_LIB/include"
export EXTRA_LDFLAGS="-lc -lm -ldl -llog -lgcc -lz -landroid -L$THIRD_LIB/lib -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384"

function build_one() {
  ./configure \
  --target-os=android \
  --prefix=$PREFIX \
  --cross-prefix=$CROSS_PREFIX \
  --pkg-config=/usr/bin/pkg-config \
  --enable-cross-compile \
  --arch=$ARCH \
  --cpu=$CPU \
  --cc=$CC \
  --cxx=$CXX \
  --nm=$TOOLCHAIN/$ARCH-linux-$ANDROID-nm \
  --strip=$TOOLCHAIN/$ARCH-linux-$ANDROID-strip \
  --enable-cross-compile \
  --sysroot=$SYSROOT \
  --extra-cflags="$EXTRA_CFLAGS" \
  --extra-ldflags="$EXTRA_LDFLAGS" \
  --enable-hwaccels --enable-static --disable-shared --disable-doc --enable-neon --enable-asm --disable-small --enable-jni --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-debug --enable-gpl --disable-avdevice --disable-indevs --disable-outdevs --enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale --enable-avfilter --enable-network --enable-bsfs --disable-postproc --enable-filters --enable-encoders --enable-libx264 --enable-encoder='libx264' --disable-encoder='a64multi,a64multi5,alias_pix,amv,apng,aptx,aptx_hd,asv1,asv2,avrp,avui,cinepak,cljr,comfortnoise,dpx,ffvhuff,fits,hap,ilbc_at,mlp,nellymoser,pam,pbm,pcx,pgm,pgmyuv,ppm,prores,prores_aw,prores_ks,qtrle,r10k,r210,ra_144,roq,roq_dpcm,rv10,rv20,s302m,sbc,sgi,snow,sunrast,svq1,targa,tta,utvideo,v210,v308,v408,v410,vc2,wrapped_avframe,xbm,xface,xsub,xwd,y41p,zmbv' --disable-decoders --enable-decoder='mjpeg,mpeg4,h263,h264,flv,hevc,wmv3,msmpeg4v3,msmpeg4v2,msvideo1,vc1,mpeg1video,mpeg2video,aac,ac3,ac3_fixed,m4a,amrnb,amrwb,vorbis,wmav2,truehd,tscc,tscc2,dvvideo,msrle,cinepak,indeo5,vp8,vp9,av1,mp3float,mp3,mp3adufloat,mp3adu,mp3on4float,mp3on4,aac_fixed,aac_latm,eac3,png,wmav1,wmv1,wmv2,pcm_alaw,pcm_dvd,pcm_f16le,pcm_f24le,pcm_f32be,pcm_f32le,pcm_f64be,pcm_f64le,zlib,flac,opus,mlp,pcm_s16be,pcm_s16le,pcm_s24be,pcm_s24le,pcm_s32be,pcm_s32le,pcm_s64be,pcm_s64le,pcm_mulaw,alac,adpcm_ms,pcm_u16be,pcm_u16le,pcm_u24be,pcm_u24le,pcm_u32be,pcm_u32le,pcm_vidc,pcm_zork,adpcm_ima_qt,adpcm_ima_wav,gif' --enable-muxers --enable-parsers --enable-nonfree --enable-protocols --disable-openssl --enable-protocol=https --disable-demuxers --enable-demuxer='aac,ac3,alaw,amr,amrnb,amrwb,ape,asf,asf_o,avi,cavsvideo,codec2,concat,dnxhd,eac3,flac,flv,gif,gif_pipe,h263,h264,hevc,hls,image2,image2pipe,jpeg_pipe,lrc,m4v,matroska,webm,mjpeg,mov,mp4,m4a,3gp,mp3,mpeg,mpegts,mv,ogg,png_pipe,realtext,rm,rtp,rtsp,pcm_s16be,pcm_s16le,pcm_s32be,pcm_s32le,sdp,srt,swf,vc1,wav,webm_dash,manifest,xmv,pcm_f32be,pcm_f32le,pcm_f64be,pcm_f64le,mpegvideo,mulaw,sami,srt' \
  $ADDITIONAL_CONFIGURE_FLAG
make
make install
}

build_one

function link_one_ffmpeg() {
  $TOOLCHAIN/$ARCH-linux-$ANDROID-ld -rpath-link=$PLATFORM_API/usr/lib -L$PLATFORM_API/usr/lib \
  -L$PREFIX/lib -soname libffmpeg.so \
  -shared -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so \
  $PREFIX/lib/libavcodec.a \
  $PREFIX/lib/libavfilter.a \
  $PREFIX/lib/libswresample.a \
  $PREFIX/lib/libavformat.a \
  $PREFIX/lib/libavutil.a \
  $PREFIX/lib/libswscale.a \
  $PREFIX/lib/libx264.a \
  -lc -lm -lz -ldl -llog -landroid --dynamic-linker=/system/bin/linker $TOOL/lib/gcc/$ARCH-linux-$ANDROID/4.9.x/libgcc_real.a
}

link_one_ffmpeg

#mp3lame
#--enable-libmp3lame \
#--enable-encoder=libmp3lame \

#x264
#--enable-libx264 \
#--enable-encoder=libx264 \

#https
#--enable-openssl \
#--enable-protocol=https \

#libx264: require_pkg_config --> check_pkg_config

执行 build_ffmpeg_one.sh,这个脚本的配置基于主项目的同名文件,由于交叉编译 mp3lame、openssl(https) 失败,所以被我 disable 了。 顺便提一下,ndk 21 已经是极限,再往上升版本就会由于找不到某些文件编译失败,如果有突破的敬请指教一下。 为了跑模拟器想编译出 x86_64 版本,但也是失败告终,求指教。

vince-styling avatar Aug 17 '25 06:08 vince-styling

Hãy cho tôi một độ nhay redmi 9a ff

naythiet2000-prog avatar Aug 17 '25 15:08 naythiet2000-prog

@yuyingfeng1989 @vince-styling 最新版已兼容ffmpe的16kb对齐

xufuji456 avatar Aug 27 '25 09:08 xufuji456

@yuyingfeng1989 @vince-styling 最新版已兼容ffmpe的16kb对齐

你好,请教下如何使用ffmpeg源码在linux下编译出支持16kb的,尝试很多次编译的要么还是4kb,要么编译不过去

hxzcan avatar Nov 15 '25 09:11 hxzcan

@yuyingfeng1989 @vince-styling 最新版已兼容ffmpe的16kb对齐

你好,请教下如何使用ffmpeg源码在linux下编译出支持16kb的,尝试很多次编译的要么还是4kb,要么编译不过去

老板,问问题要专业点,这样问谁知道怎么回你

vince-styling avatar Dec 21 '25 13:12 vince-styling