2019. 6. 3. 08:59ㆍProgramming/Android
ffmpeg를 사용해서 muxing을 하기 위해 파일을 여니, ffmpeg avcodec_open2 returns -22 if I change my speaker configuration, stackoverflow의 글처럼, avcodec_open2에서 -22를 리턴하는 상황이 발생했다. 차이점이라면 Stackoverflow의 글에서는 스피커와 관련된 설정을 변경했다고 하고, 나의 경우에는 아무런 설정의 변경이 없었다는 것 정도. 알고보니 ffmpeg에 mux/demux관련된 모듈이 빠져있어서 발생하는 문제로, ffmpeg를 다시 빌드해야 해결할 수 있을 것 같았다.
일단 기본적인 내용은 ffmpeg for android 빌드, not to be programmer 글과 윈도우에서 AndroidStudio NDK 'ffmpeg' 빌드, 개발저장소 글을 참조했다. 다만 configure에 mux와 demux 관련된 설정을 추가했다.
처음에는 arch linux를 사용하는 개발서버에서 빌드를 시도했다. 빌드 도중에 C compiler test failed.
와 같은 에러가 발생했는데, /bbuild/config.log
를 확인해보니 libtinfo.so.5
라는 라이브러리를 찾지 못하는 게 원인이었다. 검색해보니 ncurses
라는 녀석을 설치해줘야 하는데, arch linux에는 apt-get도 없어서 설치하는데 난항을 겪기는 했지만, webget을 이용해서 설치하고 나서 에러가 출력되지 않는 것은 확인했다.
하지만 toolchain을 설치하고 config.log를 확인하며 빌드를 반복했으나, 답이 나오지 않아서 cygwin을 사용하기로 했다. cygwin을 설치할 때 dos2unix, ncurses, make, vim 등을 선택해야 한다는 걸 몰라서, 꽤 여러번 추가 설치를 해야했다. ndk를 다운받기 귀찮아서 개발 서버에 받아놨던 ndk를 복사했더니, 실행할 수 없다는 에러가 떠서 잠깐 당황했으나 ndk-linux를 ndk-window에서 사용하려고 했으니 당연한 결과였다.
일단 현재까지 빌드에 성공한 configure 파일은 아래와 같다. 남은건 앱에 적용해서 확인해보는 정도일 듯 했다.
#!/bin/bash
NDK=`cygpath -m $HOME/workspace/ndk-win`
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
CUR=`cygpath -m $(pwd)`
TEMPDIR=`cygpath -m $HOME/tmp`
TMP=`cygpath -m $HOME/tmp`
function build_one
{
sed -i 's/ln_s="ln -s -f"/ln_s="cp -f"/g' ./configure
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-shared \
--disable-static \
--enable-version3 \
--enable-ffmpeg \
--disable-encoders \
--disable-devices \
--disable-avdevice \
--disable-debug \
--enable-filters \
--enable-avdevice \
--enable-swscale \
--enable-avfilter \
--enable-muxers \
--enable-muxer=mp4 \
--enable-muxer=avi \
--enable-muxer=h264 \
--enable-muxer=hevc \
--enable-demuxers \
--enable-demuxer=image2 \
--enable-demuxer=matroska \
--enable-demuxer=mp4 \
--enable-demuxer=avi \
--enable-demuxer=h264 \
--enable-demuxer=hevc \
--enable-demuxer=aac \
--enable-decoder=aac \
--enable-parser=aac \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
sed -i ':a;N;$!ba;s/gcc 4.9\r/gcc 4.9/g' ./config.h # 4.9은 toolchain의 version과 같음
sed -i ':a;N;$!ba;s/gcc 4.9\r/gcc 4.9/g' ./config.mak
# make clean
# make
# make install
}
CPU=arm
PREFIX=$CUR/android/$CPU
ADDI_CFLAGS="-marm"
build_one
'Programming > Android' 카테고리의 다른 글
[삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #4 / FFmpeg 재빌드(64bits) (0) | 2019.06.10 |
---|---|
[삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #3 / 테스트 코드를 이용하여 MP4 컨테이너 씌우기 (0) | 2019.06.03 |
[삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #1 (4) | 2019.05.29 |
Flutter 관련 자료 정리 (0) | 2019.05.26 |
[Android/Java] 파일 출력(FileOutputStream)관련 삽질 기록 (0) | 2019.05.23 |