Linux 에서 ffmpeg - 4.1, arm 32, arm 64, x86 컴 파일
9675 단어 Linuxffmpeg 오디 오 비디오 개발
목표.
준비 작업
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 // 주 기록 오류
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.