Linux 에서 ffmpeg - 4.1, arm 32, arm 64, x86 컴 파일

목차
목표.
준비 작업
arm 버 전 컴 파일
닥 친 문제 및 해결 방안
arm 32, arm 64, 성공
컴 파일 x86
목표.
ffmpeg - 4.1 버 전의 arm 32, arm 64, x86 동적 라 이브 러 리 를 컴 파일 합 니 다.
준비 작업
새 디 렉 터 리, mkdir ffmpeg, cd ffmpeg, ffmpeg 4.1 소스 코드 를 다운로드 하고 압축 을 풀 수 있 습 니 다.http://ffmpeg.org/releases/
#   
wget http://ffmpeg.org/releases/ffmpeg-4.2.3.tar.bz2
 
#   
tar xvf ffmpeg-4.2.3.tar.bz2

같은 디 렉 터 리 ffmpeg 에서 컴 파일 러 를 다운로드 합 니 다. 버 전 은 14b 를 선 택 했 습 니 다.https://developer.android.google.cn/ndk/downloads/older_releases 
#   
wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
 
#   
unzip android-ndk-r21b-linux-x86_64.zip

ffmpeg 4.1 configure 파일 수정:
#          
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

#        
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

ffmpeg 4.1 루트 디 렉 터 리 에서 run. sh 파일, run 64. sh 파일 을 작성 합 니 다.
#run.sh, arm 32
#!/bin/bash
#modify those veriable based on your env
#===========================
NDK=/home/ht-dong/ffmpeg/android-ndk-r14b
#32 or 64
archbit=32

#===========================
echo "build for 32bit"
#32bit
abi='armeabi'
cpu='arm'
arch='arm'
android='androideabi'

SYSROOT=$NDK/platforms/android-24/arch-$arch/
TOOLCHAIN=$NDK/toolchains/$cpu-linux-$android-4.9/prebuilt/linux-x86_64

PREFIX=$(pwd)/android/$cpu
#ADDI_CFLAGS="-marm"

function build_one
{
    ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --enable-yasm \
    --cross-prefix=$TOOLCHAIN/bin/$cpu-linux-$android- \
    --target-os=linux \
    --arch=$cpu \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic -DANDROID" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
}

build_one
#run64.sh
#!/bin/bash
#modify those veriable based on your env
#===========================
NDK=/home/ht-dong/ffmpeg/android-ndk-r14b
#32 or 64
archbit=64

#===========================
#64bit
echo "build for 64bit"
abi='arm64-v8a'
cpu='aarch64'
arch='arm64'
android='android'

SYSROOT=$NDK/platforms/android-24/arch-$arch/
TOOLCHAIN=$NDK/toolchains/$cpu-linux-$android-4.9/prebuilt/linux-x86_64

PREFIX=$(pwd)/android/$cpu
#ADDI_CFLAGS="-marm"

function build_one
{
    ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --enable-yasm \
    --cross-prefix=$TOOLCHAIN/bin/$cpu-linux-$android- \
    --target-os=linux \
    --arch=$cpu \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic -DANDROID" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
}

build_one

arm 버 전 컴 파일
arm 32 비트 라 이브 러 리 를 먼저 컴 파일 합 니 다:
#  run.sh      
chmod 777 run.sh
 
#   
./run.sh

닥 친 문제 및 해결 방안
오류 1:
libavformat/udp.c: In function 'udp_set_multicast_sources':
libavformat/udp.c:290:28: error: request for member 's_addr' in something not a structure or union
         mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
                            ^
libavformat/udp.c:292:32: error: incompatible types when assigning to type '__u32' from type 'struct in_addr'
             mreqs.imr_interface= ((struct sockaddr_in *)local_addr)->sin_addr;
                                ^
libavformat/udp.c:294:32: error: request for member 's_addr' in something not a structure or union
             mreqs.imr_interface.s_addr= INADDR_ANY;
                                ^
libavformat/udp.c:295:29: error: request for member 's_addr' in something not a structure or union
         mreqs.imr_sourceaddr.s_addr = ((struct sockaddr_in *)&sources[i])->sin_addr.s_addr;
                             ^
ffbuild/common.mak:59: recipe for target 'libavformat/udp.o' failed
make: *** [libavformat/udp.o] Error 1

udp. c 의 몇 줄 코드 를 주석 합 니 다.앞 으로 는 ffmpeg 의 udp 를 사용 하지 않 는 것 이 좋 습 니 다. 그렇지 않 으 면 예상 치 못 한 놀 라 움 이 있 을 것 입 니 다.
 
오 류 를 해결 한 후 다시 컴 파일 합 니 다. 오류 2:
libavcodec/aaccoder.c: In function 'search_for_ms':
libavcodec/aaccoder.c:803:25: error: expected identifier or '(' before numeric constant
                     int B0 = 0, B1 = 0;
                         ^
libavcodec/aaccoder.c:865:28: error: lvalue required as left operand of assignment
                         B0 += b1+b2;
                            ^
libavcodec/aaccoder.c:866:25: error: 'B1' undeclared (first use in this function)
                         B1 += b3+b4;

이름 을 바 꾸 고 B0 을 모두 b0 으로 바 꾸 었 습 니 다. 
#    ,    ,          。
:%s/B0/b0/gc

#   :
:%   。 
s search, 
B0,    , 
b0   , 
gc      。 
y,   。 n   ,     。

B1 은 사실 초기 화 된 성명 이 있 는데 803 줄 이지 만 866 은 한 순환 에서 사용 된다.이론 적 으로 는 찾 을 수 있 을 것 이다.그래서 B0 을 교체 하고 B1 의 잘못 은 더 이상 보고 하지 않 겠 습 니 다.
 
오류 2 를 해결 한 후 다시 컴 파일 합 니 다. 오류 3:
libavcodec/hevc_mvs.c: In function 'derive_spatial_merge_candidates':
libavcodec/hevc_mvs.c:208:15: error: 'y0000000' undeclared (first use in this function)
             ((y ## v) >> s->ps.sps->log2_min_pu_size))
               ^
......
libavcodec/hevc_mvs.c:207:15: error: 'x0000000' undeclared (first use in this function)
     TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size),                     \
               ^
......
libavcodec/hevc_mvs.c: In function 'ff_hevc_luma_mv_mvp_mode':
libavcodec/hevc_mvs.c:208:15: error: 'y0000000' undeclared (first use in this function)
             ((y ## v) >> s->ps.sps->log2_min_pu_size))
               ^
......
libavcodec/hevc_mvs.c:207:15: error: 'x0000000' undeclared (first use in this function)
     TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size),                     \
               ^
......
ffbuild/common.mak:60: recipe for target 'libavcodec/hevc_mvs.o' failed
make: *** [libavcodec/hevc_mvs.o] Error 1

해결 방법: libavcodec / hevc화면 음악 s. c 파일 의 변수 B0 은 b0 으로, xB0 은 xb0 으로, yB0 은 yb0 으로 변경
입력 명령:   :%s/B0/b0/gc   ,그리고 y 나 n 을 교체 하거나 건 너 뜁 니 다.
20 substitutions on 18 lines (모두 이렇게 많이 바 뀌 었 습 니 다)
 
오류 3 을 해결 한 후 다시 컴 파일 합 니 다. 오류 4:
libavcodec/opus_pvq.c: In function 'quant_band_template':
libavcodec/opus_pvq.c:498:9: error: expected identifier or '(' before numeric constant
     int B0 = blocks;
         ^
libavcodec/opus_pvq.c:559:12: error: lvalue required as left operand of assignment
         B0 = blocks;
            ^
ffbuild/common.mak:60: recipe for target 'libavcodec/opus_pvq.o' failed
make: *** [libavcodec/opus_pvq.o] Error 1

해결 방법: libavcodec / opuspvq. c 파일 의 변수 B0 을 b0 으로 변경
입력 명령:   :%s/B0/b0/gc   ,그리고 y 나 n 을 교체 하거나 건 너 뜁 니 다.
14 substitutions on 14 lines  (수 정 된 개수)
 
arm 32, arm 64, 성공
드디어 'arm 32 버 전' 을 통 과 했 습 니 다.

그리고 run 64. sh 스 크 립 트 를 직접 실행 하여 생 성 합 니 다!
 
컴 파일 x86
ffmpeg 4.1 루트 디 렉 터 리 에서 스 크 립 트 run 직접 새로 만 들 기x86. sh, 그리고 실행,
#    ,           ,          。
PREFIX=$(pwd)/ffmpeg_x86

./configure --enable-shared --prefix=$PREFIX

make

sudo make install

오 류 는 다음 과 같다.
INSTALL	libavdevice/libavdevice.a
LD	libavutil/libavutil-56.so
/usr/bin/ld: libavutil/log2_tab.o: Relocations in generic ELF (EM: 183)
/usr/bin/ld: libavutil/log2_tab.o: Relocations in generic ELF (EM: 183)
libavutil/log2_tab.o: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
ffbuild/library.mak:102: recipe for target 'libavutil/libavutil-56.so' failed
make: *** [libavutil/libavutil-56.so] Error 1

깨끗 한 ffmpeg 소스 코드 가 필요 할 것 같 습 니 다. 다시 컴 파일 합 니 다.따라서 다른 폴 더 를 만 들 고 다시 압축 을 풀 며 원본 파일 은 수정 되 지 않 고 직접 컴 파일 하여 생 성 합 니 다.

 
 
내 면 의 연극: arm 의 두 가지 버 전 으로 이렇게 많은 곳 을 바 꾸 었 는데 이 컴 파일 된 라 이브 러 리 에 구덩이 가 많 지 않 을 까? □ | | | | |
참조 링크:
https://blog.csdn.net/qq_34732729/article/details/107690316  // 이 세 개의 라 이브 러 리
https://blog.csdn.net/qq_34902522/article/details/87879145    // 주 기록 오류

좋은 웹페이지 즐겨찾기