2012-01-11 213 views
10

Tôi đang cố gắng xây dựng FFMPEG với libx264 dành cho Android.Xây dựng FFMPEG với x264 cho Android

Tôi có thể xây dựng và sử dụng thành công FFMPEG cho Android nhưng tôi nhận ra rằng tôi cần khả năng mã hóa, do đó tôi đang cố gắng xây dựng FFMPEG với x264.

Tôi đang sử dụng hướng dẫn này để xây dựng FFmpeg dành cho Android http://www.roman10.net/how-to-build-ffmpeg-for-android/

Khi cố gắng xây dựng FFMPEG tôi nhận được một lỗi:

"ERROR: libx264 not found"

Và trong nhật ký của tôi nó nói:

"/usr/local/lib/libx264.a: could not read symbols: Archive has no index; run ranlib to add one..."

Tôi có phiên bản mới nhất của cả FFMPEG và x264. Tôi hiểu rằng FFMPEG trông cho tiêu đề và các thư viện trong usr/lib và usr/include, vì vậy để làm cho nó tìm x264 tôi sử dụng CFLAGS và ldflags:

  • --extra-CFLAGS = "-Tôi/usr/local/include "
  • --extra-ldflags =" -L/usr/local/lib "

tôi đã cố gắng xây dựng x264 với nhiều tùy chọn khác nhau mà người khác trên internet đã nói rằng tôi cần. ví dụ. --enable-shared, --enable-static, --disable-pthreads, vv Một số diễn đàn cho phép điều này, những người khác nói không vô hiệu hóa điều đó.

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao, Cảm ơn

EDIT:

Nếu tôi xây dựng FFmpeg với các lệnh đơn giản nhất để bao gồm libx264 sau đó nó hoạt động. tức là.

./configure --enable-gpl --enable-libx264 --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --enable-static --enable-shared 

Tuy nhiên tôi cần nó để làm việc cho Android. Các kịch bản tôi đang sử dụng là:

NDK=~/Desktop/android-ndk-r7 
PLATFORM=$NDK/platforms/android-8/arch-arm/ 
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86 
function build_one 
{ 
./configure --target-os=linux \ 
    --prefix=$PREFIX \ 
    --enable-cross-compile \ 
    --enable-shared \ 
    --enable-static \ 
    --extra-libs="-lgcc" \ 
    --arch=arm \ 
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ 
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ 
    --sysroot=$PLATFORM \ 
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS -I/usr/local/include" \ 
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L $PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog -L/usr/local/lib " \ 
    --enable-gpl \ 
    --enable-libx264 \ 
    --disable-everything \ 
    --enable-demuxer=mov \ 
    --enable-demuxer=h264 \ 
    --disable-ffplay \ 
    --enable-protocol=file \ 
    --enable-avformat \ 
    --enable-avcodec \ 
    --enable-decoder=rawvideo \ 
    --enable-decoder=mjpeg \ 
    --enable-decoder=h263 \ 
    --enable-decoder=mpeg4 \ 
    --enable-decoder=h264 \ 
    --enable-encoder=mjpeg \ 
    --enable-encoder=h263 \ 
    --enable-encoder=mpeg4 \ 
    --enable-encoder=h264 \ 
    --enable-parser=h264 \ 
    --disable-network \ 
    --enable-zlib \ 
    --disable-avfilter \ 
    --disable-avdevice \ 
    $ADDITIONAL_CONFIGURE_FLAG 

make clean 
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 -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 
} 

CPU=armv7-a 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " 
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG= 
build_one 

Tôi đoán rằng một số tùy chọn trong lệnh configure của tôi là mâu thuẫn với phép libx264

LƯU Ý: Nếu tôi loại bỏ enable-libx264 sau đó nó hoạt động

+0

Nếu tôi xây dựng cả x264 và FFmpeg với --disable tĩnh và enable-chia sẻ, sau đó tôi vẫn nhận được lỗi tương tự, nhưng lần này trong nhật ký của tôi nó không có còn nói "... không đọc được biểu tượng ..." nhưng thay vào đó nó nói "không thể tìm thấy -lx264 ..." – Kage

+0

Bạn cài đặt x264 như thế nào? Bạn đã cài đặt nó bằng cách tải xuống nguồn và thực hiện './configure', 'make', 'make install', hoặc bạn đã làm gì khác? Ngoài ra, hệ thống xây dựng của bạn là gì - * nix hoặc Windows (với cygwin/msys)? – sashoalm

+0

Tôi đã tải xuống nguồn và đã sử dụng .configure, tạo, cài đặt Im trên mac (10.7) – Kage

Trả lời

3

Tôi đã từng gặp vấn đề tương tự. Nhưng sau khi hạ cấp NDK xuống phiên bản 5c, nó hoạt động như được mô tả bởi halfninja. (ubuntu 64bit). hình như vẫn có một số thay đổi trong toolchain từ 5 đến 7.

[email protected]:/tmp/android-ffmpeg-x264/Project/jni$ ndk-build 
Compile thumb : ffmpeg <= ffmpeg.c 
Compile thumb : ffmpeg <= cmdutils.c 
Executable  : ffmpeg 
Install  : ffmpeg => libs/armeabi/ffmpeg 
Compile thumb : videokit <= uk_co_halfninja_videokit_Videokit.c 
Compile thumb : videokit <= ffmpeg.c 
Compile thumb : videokit <= cmdutils.c 
SharedLibrary : libvideokit.so 
Install  : libvideokit.so => libs/armeabi/libvideokit.so 
+0

Làm cách nào để tôi có thể sử dụng lệnh này để chạy các lệnh ffmpeg trong Android? Tôi có phải chọn tùy chọn "thêm hỗ trợ gốc" trong nhật thực để sử dụng các thư viện này không? –

1

Tôi đã phát hiện ra tùy chọn enable-tĩnh không có bất kỳ ảnh hưởng ffmpeg liên kết hành vi cho libx264. Tôi quản lý để xây dựng một bản sao của ffmpeg với libx264 bao gồm tĩnh bằng cách chỉnh sửa config.mak sau khi tôi muốn chạy ./configure x264

  • xây dựng từ nguồn tin trong thư mục khác
  • Thêm libx264.a vào dòng EXTRALIBS trong config.mak
  • Xóa -lx264 khỏi dòng EXTRALIBS trong cấu hình.mak

Trước

EXTRALIBS=-ldl -lX11 -lx264 etc. 

Sau

EXTRALIBS=/home/adam/x264sourcebuild/libx264.a -ldl -lX11 etc. 
3

Mã nguồn ffmpeg dường như được cập nhật, và tôi có thể biên dịch ffmpeg với x264 dành cho Android NDK như sau.

1 Tải về android-ffmpeg-x264 tập tin git của halfninja từ https://github.com/halfninja/android-ffmpeg-x264

2 Tại "halfninja-android-ffmpeg-x264-fe12be0/dự án/JNI" thư mục, sửa đổi "configure_ffmpeg.sh" liên kết "libgcc .a "để giải quyết một vấn đề không thể giải quyết" __aeabi_f2uiz ".

./configure $DEBUG_FLAG --enable-cross-compile \ 
--arch=arm5te \ 
--enable-armv5te \ 
--target-os=linux \ 
--disable-stripping \ 
--prefix=../output \ 
--disable-neon \ 
--enable-version3 \ 
--disable-shared \ 
--enable-static \ 
--enable-gpl \ 
--enable-memalign-hack \ 
--cc=arm-linux-androideabi-gcc \ 
--ld=arm-linux-androideabi-ld \ 
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -I../x264 -Ivideokit" \ 
$featureflags \ 
--disable-ffmpeg \ 
--disable-ffplay \ 
--disable-ffprobe \ 
--disable-ffserver \ 
--disable-network \ 
--enable-filter=buffer \ 
--enable-filter=buffersink \ 
--disable-demuxer=v4l \ 
--disable-demuxer=v4l2 \ 
--disable-indev=v4l \ 
--disable-indev=v4l2 \ 
--extra-ldflags="-L../x264 -L../toolchain/lib/gcc/arm-linux-androideabi/4.4.3" \ 
--extra-libs="-lgcc" 

3 Sửa đổi "Android.mk" để liên kết thư viện mới "libswresample.a".

FFMPEG_LIBS := $(addprefix ffmpeg/, \ 
libavdevice/libavdevice.a \ 
libavformat/libavformat.a \ 
libavcodec/libavcodec.a \ 
libavfilter/libavfilter.a \ 
libswscale/libswscale.a \ 
libavutil/libavutil.a \ 
libswresample/libswresample.a \ 
libpostproc/libpostproc.a) 

4 Thay thế thư mục ffmpeg.c và cmdutils.c trong thư mục videokit bằng thư mục ffmpeg.

5 Làm theo quy trình được mô tả trong README.textile.

+0

Làm cách nào để tôi có thể sử dụng lệnh này để chạy các lệnh ffmpeg trong Android? Tôi có phải đi cho "thêm hỗ trợ bản địa" tùy chọn trong nhật thực để sử dụng các thư viện? –

+0

không hoạt động đối với tôi, bạn đang sử dụng NDK nào? – Guy

2

Đây là những lá cờ của tôi làm việc:

x264 (một ổn định gần đây):

./configure --cross-prefix=arm-linux-androideabi- \ 
--enable-pic \ 
--enable-static \ 
--disable-cli \ 
--disable-asm \ 
--host=arm-linux 

ffmpeg (phát hành/0.10):

./configure --enable-cross-compile \ 
--arch=arm5te \ 
--enable-armv5te \ 
--target-os=linux \ 
--disable-stripping \ 
--prefix=../output \ 
--disable-neon \ 
--enable-version3 \ 
--disable-shared \ 
--enable-static \ 
--enable-gpl \ 
--enable-memalign-hack \ 
--cc=arm-linux-androideabi-gcc \ 
--ld=arm-linux-androideabi-gcc \ 
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated" \ 
--disable-everything \ 
--enable-decoder=h264 \ 
--enable-demuxer=mov \ 
--enable-muxer=mp4 \ 
--enable-encoder=libx264 \ 
--enable-libx264 \ 
--enable-protocol=file \ 
--enable-decoder=aac \ 
--enable-encoder=aac \ 
--disable-ffmpeg \ 
--disable-ffplay \ 
--disable-ffprobe \ 
--disable-ffserver \ 
--disable-network \ 
--enable-filter=buffer \ 
--enable-filter=buffersink \ 
--enable-filter=scale \ 
--disable-demuxer=v4l \ 
--disable-demuxer=v4l2 \ 
--disable-indev=v4l \ 
--disable-indev=v4l2 \ 
--extra-cflags="-I../x264" \ 
--extra-ldflags="-L../x264" \ 
--extra-libs="-lgcc" 

Rõ ràng bạn sẽ phải điều chỉnh các đường dẫn .

2

tôi đã đặt cùng một hệ thống xây dựng Android cho ffmpeg + x264 ở đây: https://github.com/guardianproject/android-ffmpeg

Chúng tôi đang làm việc trên một số wrapper Java quá để chạy nó, nhưng đó không phải là thực sự có thể sử dụng được nêu ra.

+0

quá tệ đến nỗi nó chỉ dành cho Debian/Ubuntu, làm thế nào về mac? – shem

+0

Xây dựng trên Mac OS X và các phiên bản khác có thể, bản vá chào mừng :) chúng tôi chỉ thấy việc chạy bản dựng Android gốc trên Debian/Ubuntu dễ dàng hơn rất nhiều so với bất kỳ nền tảng nào khác, bao gồm các bản phân phối GNU/Linux khác. –

+0

Không biên dịch được trên máy mac, có lẽ vì trình soạn thảo lib bạn nên làm trước đây. – shem

1

Tôi đã gặp vấn đề tương tự trước đây, và tôi đã cố gắng nhiều lần để tìm hiểu lý do:

Bạn phải chắc chắn rằng các x264 và ffmpeg đang sử dụng cùng một cách để biên dịch. như: sử dụng NDK của Android. Sử dụng cùng một trình biên dịch gcc.

Vì vậy, bạn không thể biên dịch ffmpeg bằng lệnh này: "- tiền tố chéo = $ PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-", nhưng biên dịch x264 mà không có điều đó. Đây là x264 biên dịch kịch bản của tôi:

./configure --prefix=$PREFIX \ 
--enable-static \ 
--enable-pic \ 
--disable-asm \ 
--disable-cli \ 
--host=arm-linux \ 
--cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- \ 
--sysroot=$PLATFORM 

make 
sudo make install 
sudo ldconfig 
Các vấn đề liên quan