Tôi đã thực hiện việc này, theo nghĩa đen trong nhiều ngày. Tôi đang cố gắng xây dựng FFmpeg với libmp3lame để sử dụng trong một ứng dụng Android. Tập lệnh xây dựng đặt cờ --sysroot
trỏ đến thư mục NDK của Android cần thiết để xây dựng các thư viện này theo cách Android có thể sử dụng chúng.Làm thế nào tôi có thể nhận được FFmpeg để xác định vị trí thư viện được cài đặt khi --sysroot trỏ đến một thư mục khác?
Sự cố xảy ra khi tôi thêm cờ vào --enable-libmp3lame
; Tôi nhận được ERROR: libmp3lame >= 3.98.3 not found
trong khi bắt đầu xây dựng. Tôi biết rằng LAME, và thư viện của nó được cài đặt, bởi vì tôi chỉ có thể chạy ./configure --enable-libmp3lame
theo cách thủ công và cấu hình khởi chạy mà không bị cản trở và cho thấy rằng libmp3lame được bật cho bản dựng này. Tuy nhiên, việc xây dựng như thế này sẽ không làm việc cho những gì tôi cần, vì tôi cần NDK của Android để thực hiện một số công việc.
Tôi đã theo dõi các vấn đề xuống thực tế là xây dựng này kịch bản được tuyên bố sysroot, và thông qua một số nghiên cứu, tôi đã cố gắng thêm -Luser/include
, -L/user/include
đến CFLAGS thêm, và ldflags (mà tôi đã đọc là vị trí tìm kiếm mặc định cho gcc). Tôi cũng đã thử nhiều thứ khác, nhưng tôi tin chắc rằng ai đó ở đây có thể giúp giải quyết vấn đề cụ thể này. Đây toàn bộ xây dựng kịch bản là như sau:
thêm thông tin:
- OS xây dựng: Ubuntu 11.10
- FFmpeg Ver: Gần đây nhất từ git
- LAME Ver: 3.9.x
- Android NDK: r7
build.sh
#!/bin/bash
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/android-ndk
fi
SYSROOT=$NDK/platforms/android-3/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH
rm -rf build/ffmpeg
mkdir -p build/ffmpeg
cd ffmpeg
# Don't build any neon version for now
for version in armv5te armv7a; do
DEST=../build/ffmpeg
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --soname-prefix=/data/data/net.smartnotes/lib/"
FLAGS="$FLAGS --enable-shared --disable-symver"
FLAGS="$FLAGS --enable-small --optimization-flags=-O2"
FLAGS="$FLAGS --disable-everything --enable-protocol=file"
FLAGS="$FLAGS --enable-libmp3lame --enable-encoder=nellymoser"
case "$version" in
neon)
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
# Runtime choosing neon vs non-neon requires
# renamed files
ABI="armeabi-v7a"
;;
armv7a)
# I have tried many things here.
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp"
EXTRA_LDFLAGS=""
ABI="armeabi-v7a"
;;
*)
# I have tried many things here.
EXTRA_CFLAGS="-Luser/include"
EXTRA_LDFLAGS=""
ABI="armeabi"
;;
esac
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"
mkdir -p $DEST
echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
make clean
make -j4 || exit 1
make install || exit 1
done
Tôi thực sự không biết các tệp libmp3lame thực được cài đặt ở đâu. Tôi đã kiểm tra trong/người dùng/bao gồm và có một tập tin lame/lame.h đó là trong đó, và tôi đặt nó trong [..] android-ndk/nền tảng/android-3/arch-arm/người dùng/bao gồm/lame dir, tuy nhiên điều đó đã không giúp đỡ. Tôi có nghi ngờ dai dẳng rằng tập tin tiêu đề của chính nó sẽ không đủ để cắt nó. Tôi cũng đã thử sao chép và dán một thư mục đầy đủ các tiêu đề LAME và các tệp C vào thư mục ở trên, quá. –
Sao chép chỉ 1 tệp hoặc 1 thư mục sẽ không hoạt động. Bạn phải chắc chắn rằng bạn đã sao chép hoàn toàn tất cả các tệp và thư mục cần thiết, vào đúng vị trí. Nếu tôi nhớ chính xác 'make install' sẽ in ra tất cả các tệp đã sao chép, vì vậy bạn có thể xây dựng lại LAME và khi thực hiện 'make install', hãy lưu ý tất cả tên tệp và thư mục. – sashoalm
Cảm ơn, tôi đã làm điều đó bằng cách tải xuống nguồn LAME và trích xuất nó vào một thư mục. Khi tôi gọi là 'cấu hình' tôi đã làm --prefix = (chỉ định các thư mục mà các tập tin được thực hiện nên được xuất ra). Hoàn thành việc cài đặt, và lấy thư mục include và lib, và lưu trữ nó trong NDK của Android bao gồm và thư mục lib, tương ứng. Tôi vẫn không thể làm việc này được. Tôi đã từ bỏ việc cố gắng sử dụng FFmpeg để xử lý LAME cho tôi, và trở lại chỉ bằng cách sử dụng một bản dựng LAME gốc trong ứng dụng của tôi (mà tôi có thể làm việc, nhưng đầu ra âm thanh không chính xác). [...] –