คอมไพล์ FFMPEG + x264 - การอ้างอิงที่ไม่ได้กำหนด

ฉันพยายามค้นหาวิธีแก้ปัญหาทางออนไลน์มาสองสามวันแล้วโดยไม่มีโชค ฉันใช้ Ubuntu และพยายามรวบรวม FFMPEG เวอร์ชันเสถียรล่าสุด (1.0.1) พร้อมรองรับ x264 ฉันแน่ใจว่าได้ถอนการติดตั้ง x264 ที่มีอยู่แล้ว จากนั้นจึงดาวน์โหลดซอร์ส x264 ล่าสุดและคอมไพล์ด้วยการกำหนดค่าต่อไปนี้:

./configure --prefix=$PREFIX \
    --enable-shared \
    --enable-static \
    --disable-gpac \
    --extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fno-short-enums -D__ARM_ARCH
libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:159: undefined reference to `x264_picture_init'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:179: undefined reference to `x264_encoder_reconfig'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:190: undefined reference to `x264_encoder_encode'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:196: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:101: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:231: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:284: undefined reference to `x264_param_default'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:292: undefined reference to `x264_param_default_preset'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:314: undefined reference to `x264_param_parse'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:459: undefined reference to `x264_param_apply_fastfirstpass'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:490: undefined reference to `x264_param_apply_profile'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:533: undefined reference to `x264_encoder_open_129'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:544: undefined reference to `x264_encoder_headers'
_ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP " \ --extra-ldflags=" -nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/usr/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -lc -lm -ldl -lgcc" \ --cross-prefix=${ARM_PRE}- \ --disable-asm \ --host=arm-linux \ make clean make install

ทุกอย่างเป็นไปด้วยดี และฉันตรวจสอบเวอร์ชันที่ติดตั้งแล้ว:

x264 -V
    x264 0.129.x
    built on Dec 27 2012, gcc: 4.6.1
    configuration: --bit-depth=8 --chroma-format=all
    x264 license: GPL version 2 or later

ฉันลองรวบรวม FFMPEG ด้วยตัวเลือกต่อไปนี้:

./configure --target-os=linux \
    --enable-libx264 \
    --enable-gpl \
    --prefix=$PREFIX \
    --extra-cflags="-I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/android/armv7-a/include -I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264 -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 " \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/android/armv7-a/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --enable-cross-compile \
    --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 \

การกำหนดค่าและทำให้การติดตั้ง clean/make ทำงานได้ดี แต่เมื่อฉันพยายามสร้างไฟล์ .so คำสั่งต่อไปนี้ล้มเหลว:

/home/tishu/Apps/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld 
    -rpath-link=./android/armv7-a/usr/lib -L/home/tishu/Apps/android-ndk-r8d/platforms/android-14/arch-arm/usr/lib -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic \
    --whole-archive --no-undefined -o ./android/armv7-a/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 /home/tishu/Apps/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

สิ่งนี้ล้มเหลวด้วยผลลัพธ์ต่อไปนี้:

libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:159: undefined reference to `x264_picture_init'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:179: undefined reference to `x264_encoder_reconfig'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:190: undefined reference to `x264_encoder_encode'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:196: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:101: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:231: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:284: undefined reference to `x264_param_default'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:292: undefined reference to `x264_param_default_preset'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:314: undefined reference to `x264_param_parse'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:459: undefined reference to `x264_param_apply_fastfirstpass'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:490: undefined reference to `x264_param_apply_profile'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:533: undefined reference to `x264_encoder_open_129'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:544: undefined reference to `x264_encoder_headers'

เวอร์ชัน x264 ที่กำลังมองหา (129) เป็นเวอร์ชันที่ติดตั้งและคอมไพล์ได้สำเร็จด้วย --eanable-shared แน่นอนว่าคอมไพล์ทั้งหมดใช้ได้เมื่อฉันไม่รวม libx64

คำถาม: ฉันจะระบุเส้นทางรวมสำหรับคำสั่งสุดท้ายได้อย่างไร ฉันพยายามเพิ่มเส้นทางไปที่ $PATH และเพิ่มสิ่งนี้เป็นอาร์กิวเมนต์โดยไม่มีโชค: -I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264

ขอบคุณ


person tishu    schedule 29.12.2012    source แหล่งที่มา
comment
การขุดค้นเพิ่มเติมเกี่ยวกับวิธีการทำงานของ ld: network-theory.co .uk/docs/gccintro/gccintro_95.html - ฉันเพิ่งเพิ่ม libx64.a ลงในรายการไฟล์ที่จะลิงก์ และตอนนี้ใช้งานได้แล้ว   -  person tishu    schedule 29.12.2012
comment
ข้อความ undefined reference สามารถระบุได้ว่าคุณอาจติดตั้ง x264 สองเวอร์ชันที่แตกต่างกันในเวลาเดียวกัน   -  person llogan    schedule 29.12.2012
comment
หากคุณสร้าง x264 สำหรับ ARM อย่างถูกต้อง คุณจะไม่สามารถรันเพื่อรับแสงครั้งที่สองได้ คุณอาจล้มเหลวในการถอนการติดตั้งเวอร์ชัน x86 หรือสร้างใหม่แล้ว ไม่ว่าในกรณีใด คุณอาจแก้ไขบิลด์ ffmpeg ของคุณได้โดยเพิ่ม /home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264/libx264.so ถึง --extra-ldflags=   -  person Alex Cohn    schedule 31.12.2012
comment
สวัสดี Tishu :) ฉันกำลังพยายามเล่นไฟล์ .ts จากแอป Android สำหรับสิ่งนี้ ฉันได้ใช้ไลบรารี FFmpeg จาก github com/appunite/AndroidFFmpeg ฉันจัดการคอมไพล์และรันแอปตัวอย่างได้สำเร็จ แต่แอปไม่เล่นไฟล์ .ts คุณช่วยแนะนำฉันหน่อยได้ไหมว่าฉันควรทำอย่างไรเพื่อเล่นไฟล์ .ts ขอบคุณ   -  person Arun Badole    schedule 31.12.2012


คำตอบ (1)


สำหรับผู้ติดตาม (ไม่ใช่แม้แต่ Android แต่เป็นข้อความที่คล้ายกัน)

/.../mingw-w64-i686/lib/gcc/.../i686-w64-mingw32/bin/ld: 
libavcodec/libavcodec.a(libx264.o):libx264.c:(.text+0x3c): 
undefined reference to `x264_bit_depth'
: undefined reference to `x264_encoder_open_152'

ปรากฏว่าค่าคงที่นี้ "ลดลง" ในช่วงต้นปี 2560 ดู https://trac.ffmpeg.org/ticket/6966 และ https://trac.ffmpeg.org/ticket/6932

แก้ไข: อัปเดต ffmpeg หรือ downdate libx264...หรืออะไรบางอย่าง...

แม้ว่าทุกวันนี้มันควรจะรองรับ libx264 เวอร์ชันเก่าเช่นกัน...

person rogerdpack    schedule 06.02.2019