ffmpeg xcode 中的使用
最近比较闲,苦于ios设备上没有直接播放torrent 文件的软件,开始折腾了.找了不少资料有了思路.但是其中用到了ffmpeg 这个东西.
ffmpeg 是通用的一个视频解决框架,用C语言编写,通用性很强.
- 编译ffmpeg.
- 下载源码后可以自己手动编译 ,反正是通过各种命令 配置configure
- 通过一个很牛逼的脚本:git@github.com:kewlbear/FFmpeg-iOS-build-script.git 下载之后,检查ffmpeg的版本号,替换成最新的 然后运行脚本就行了
#!/bin/sh # directories SOURCE="ffmpeg-2.5" FAT="FFmpeg-iOS" SCRATCH="scratch" # must be an absolute path THIN=`pwd`/"thin" # absolute path to x264 library #X264=`pwd`/fat-x264 #FDK_AAC=`pwd`/fdk-aac/fdk-aac-ios CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \ --disable-doc --enable-pic" if [ "$X264" ] then CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-gpl --enable-libx264" fi if [ "$FDK_AAC" ] then CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-libfdk-aac" fi # avresample #CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample" ARCHS="arm64 armv7s armv7 x86_64 i386" COMPILE="y" LIPO="y" DEPLOYMENT_TARGET="6.0" if [ "$*" ] then if [ "$*" = "lipo" ] then # skip compile COMPILE= else ARCHS="$*" if [ $# -eq 1 ] then # skip lipo LIPO= fi fi fi if [ "$COMPILE" ] then if [ ! `which yasm` ] then echo 'Yasm not found' if [ ! `which brew` ] then echo 'Homebrew not found. Trying to install...' ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" \ || exit 1 fi echo 'Trying to install Yasm...' brew install yasm || exit 1 fi if [ ! `which gas-preprocessor.pl` ] then echo 'gas-preprocessor.pl not found. Trying to install...' (curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \ -o /usr/local/bin/gas-preprocessor.pl \ && chmod +x /usr/local/bin/gas-preprocessor.pl) \ || exit 1 fi if [ ! -r $SOURCE ] then echo 'FFmpeg source not found. Trying to download...' curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \ || exit 1 fi CWD=`pwd` for ARCH in $ARCHS do echo "building $ARCH..." mkdir -p "$SCRATCH/$ARCH" cd "$SCRATCH/$ARCH" CFLAGS="-arch $ARCH" if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ] then PLATFORM="iPhoneSimulator" CFLAGS="$CFLAGS -mios-simulator-version-min=$DEPLOYMENT_TARGET" else PLATFORM="iPhoneOS" CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET" if [ "$ARCH" = "arm64" ] then EXPORT="GASPP_FIX_XCODE5=1" fi fi XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'` CC="xcrun -sdk $XCRUN_SDK clang" CXXFLAGS="$CFLAGS" LDFLAGS="$CFLAGS" if [ "$X264" ] then CFLAGS="$CFLAGS -I$X264/include" LDFLAGS="$LDFLAGS -L$X264/lib" fi if [ "$FDK_AAC" ] then CFLAGS="$CFLAGS -I$FDK_AAC/include" LDFLAGS="$LDFLAGS -L$FDK_AAC/lib" fi TMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \ --target-os=darwin \ --arch=$ARCH \ --cc="$CC" \ $CONFIGURE_FLAGS \ --extra-cflags="$CFLAGS" \ --extra-cxxflags="$CXXFLAGS" \ --extra-ldflags="$LDFLAGS" \ --prefix="$THIN/$ARCH" \ || exit 1 make -j3 install $EXPORT || exit 1 cd $CWD done fi if [ "$LIPO" ] then echo "building fat binaries..." mkdir -p $FAT/lib set - $ARCHS CWD=`pwd` cd $THIN/$1/lib for LIB in *.a do cd $CWD echo lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB 1>&2 lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB || exit 1 done cd $CWD cp -rf $THIN/$1/include $FAT fi echo Done
- 导入项目,有静态包经验的就就不用看了,这个对于我这个半路出家的和尚还是处理了老半天才解决.
.a文件直接导入 .h文件要导入文件夹结构 配置header search 环境变量 使用的时候导入文件 结构:#import "文件夹/文件.h" - 编译.
- 首次编译.
Undefined symbols for architecture armv7: "_deflateInit2_", referenced from: _encode_frame in libavcodec.a(pngenc.o) "_crc32", referenced from: _encode_frame in libavcodec.a(pngenc.o) "_deflateReset", referenced from: _encode_frame in libavcodec.a(lclenc.o) _encode_frame in libavcodec.a(zmbvenc.o) "_compress", referenced from: _encode_strip in libavcodec.a(tiffenc.o) "_deflateBound", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) _encode_frame in libavcodec.a(pngenc.o) _encode_frame in libavcodec.a(lclenc.o) "_inflateSync", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) "_inflateReset", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) _zlib_decomp in libavcodec.a(lcldec.o) _decode_frame in libavcodec.a(tscc.o) _zerocodec_decode_frame in libavcodec.a(zerocodec.o) _decode_frame in libavcodec.a(zmbv.o) "_iconv_open", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_BZ2_bzDecompress", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_inflate", referenced from: _http_read_stream in libavformat.a(http.o) _matroska_decode_buffer in libavformat.a(matroskadec.o) _rtmp_open in libavformat.a(rtmpproto.o) _zlib_refill in libavformat.a(swfdec.o) _decode_frame_common in libavcodec.a(pngdec.o) _decode_text_chunk in libavcodec.a(pngdec.o) _flashsv_decode_frame in libavcodec.a(flashsv.o) ... "_inflateInit_", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) _rtmp_open in libavformat.a(rtmpproto.o) _swf_read_header in libavformat.a(swfdec.o) _decode_frame_apng in libavcodec.a(pngdec.o) _decode_frame_png in libavcodec.a(pngdec.o) _decode_text_chunk in libavcodec.a(pngdec.o) _flashsv_decode_init in libavcodec.a(flashsv.o) ... "_iconv", referenced from: _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_BZ2_bzDecompressEnd", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_inflateInit2_", referenced from: _http_read_header in libavformat.a(http.o) "_deflateEnd", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o) _flashsv_encode_init in libavcodec.a(flashsvenc.o) _flashsv_encode_end in libavcodec.a(flashsvenc.o) _encode_frame in libavcodec.a(pngenc.o) _encode_end in libavcodec.a(lclenc.o) _encode_init in libavcodec.a(zmbvenc.o) ... "_BZ2_bzDecompressInit", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_deflateInit_", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o) _encode_init in libavcodec.a(lclenc.o) _encode_init in libavcodec.a(zmbvenc.o) "_zlibCompileFlags", referenced from: _http_read_header in libavformat.a(http.o) "_compress2", referenced from: _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o) _flashsv_encode_frame in libavcodec.a(flashsvenc.o) "_deflate", referenced from: _flashsv_decode_frame in libavcodec.a(flashsv.o) _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o) _encode_frame in libavcodec.a(pngenc.o) _encode_frame in libavcodec.a(lclenc.o) _encode_frame in libavcodec.a(zmbvenc.o) "_inflateEnd", referenced from: _http_close in libavformat.a(http.o) _http_read_header in libavformat.a(http.o) _matroska_decode_buffer in libavformat.a(matroskadec.o) _rtmp_open in libavformat.a(rtmpproto.o) _swf_read_close in libavformat.a(swfdec.o) _decode_frame_apng in libavcodec.a(pngdec.o) _decode_frame_png in libavcodec.a(pngdec.o) ... "_uncompress", referenced from: _id3v2_read_internal in libavformat.a(id3v2.o) _mov_read_cmov in libavformat.a(mov.o) _swf_read_packet in libavformat.a(swfdec.o) _decode_frame in libavcodec.a(cscd.o) _decode_frame in libavcodec.a(dxa.o) _decode_block in libavcodec.a(exr.o) _g2m_decode_frame in libavcodec.a(g2meet.o) ... "_iconv_close", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
导入 libz.1.2.5.dylib ,再次编译
Undefined symbols for architecture armv7: "_BZ2_bzDecompressInit", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_iconv", referenced from: _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_BZ2_bzDecompress", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_BZ2_bzDecompressEnd", referenced from: _matroska_decode_buffer in libavformat.a(matroskadec.o) "_iconv_open", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_iconv_close", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
导入 libbz2.1.0.dylib ,再次编译
Undefined symbols for architecture armv7: "_iconv", referenced from: _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_iconv_open", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) "_iconv_close", referenced from: _avcodec_open2 in libavcodec.a(utils.o) _avcodec_decode_subtitle2 in libavcodec.a(utils.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
导入 libiconv.2.4.0.dylib 编译通过 3.0 后不通过
Undefined symbols for architecture x86_64: "_CMBlockBufferCreateWithMemoryBlock", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) "_CMSampleBufferCreate", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) "_CMVideoFormatDescriptionCreate", referenced from: _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionCreate", referenced from: _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionDecodeFrame", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionInvalidate", referenced from: _av_videotoolbox_default_free in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionWaitForAsynchronousFrames", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) "_kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms", referenced from: _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
导入 CoreMedia.framework 编译
Undefined symbols for architecture x86_64: "_VTDecompressionSessionCreate", referenced from: _av_videotoolbox_default_init2 in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionDecodeFrame", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionInvalidate", referenced from: _av_videotoolbox_default_free in libavcodec.a(videotoolbox.o) "_VTDecompressionSessionWaitForAsynchronousFrames", referenced from: _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o) ld: symbol(s) not found for architecture x86_64
导入 VideoToolbox.framework 编译通过
- 首次编译.
到此准备结束