=====================================================

最简单的基于FFmpeg的移动端样例系列文章列表:

最简单的基于FFmpeg的移动端样例:Android HelloWorld

最简单的基于FFmpeg的移动端样例:Android 视频解码器

最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版

最简单的基于FFmpeg的移动端样例:Android 推流器

最简单的基于FFmpeg的移动端样例:Android 视频转码器

最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

最简单的基于FFmpeg的移动端样例附件:SDL Android HelloWorld

最简单的基于FFmpeg的移动端样例:IOS HelloWorld

最简单的基于FFmpeg的移动端样例:IOS 视频解码器

最简单的基于FFmpeg的移动端样例:IOS 推流器

最简单的基于FFmpeg的移动端样例:IOS 视频转码器

最简单的基于FFmpeg的移动端样例附件:IOS自带播放器

最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld

=====================================================

本文记录IOS平台下基于FFmpeg的HelloWorld程序。该演示样例C语言的源码来自于《最简单的基于FFMPEG的Helloworld程序》。

相关的概念就不再反复记录了。

IOS程序使用FFmpeg类库的说明

IOS应用程序使用FFmpeg类库的流程例如以下所看到的。

1. 编译FFmpeg类库

编译IOS的FFmpeg类库须要支持5种架构:armv7、armv7s、arm64、i386、x86_64。当中前面3个是给真机使用的。后面2个是给模拟器使用的。

本文记录的FFmpeg类库还支持第三方类库libx264和libfaac。所以在编译之前还要先编译libx264和libfaac的源码。

整体说来。IOS下的类库须要编译成两个版本号:thin和fat。

每种架构相应一个thin版本号的类库,将这些不同架构thin版本号的类库合成起来之后。就形成了fat版本号的类库。以下简单记录一下编译步骤。编译过程中IOS SDK版本号为8.3。FFmpeg版本号为2.7.1。faac和x264分别使用了最新版本号的源码。

(1) 第三方库libx264的编译

这一步用于生成支持armv7、armv7s、arm64、i386、x86_64几种架构的fat版本号的libx264.a。以下这个脚本能够首先编译生成上面5种架构的thin版本号的libx264.a,分成5个目录存储于thin-x264目录中;然后将这些类库合并成为1个fat版本号的libx264.a,存储于fat-x264目录中。

build_x264.sh

  1. #!/bin/sh
  2. # LXH,MXY
  3. #
  4. # directories
  5. SOURCE="x264"
  6. FAT="fat-x264"
  7.  
  8. SCRATCH="scratch-x264"
  9. # must be an absolute path
  10. THIN=`pwd`/"thin-x264"
  11.  
  12. #This is decided by your SDK version.
  13. SDK_VERSION="8.3"
  14.  
  15. cd ./x264
  16.  
  17. #============== simulator ===============
  18. PLATFORM="iPhoneSimulator"
  19.  
  20. #i386
  21. ARCHS="i386"
  22.  
  23. export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
  24. export SDKROOT=$DEVROOT/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  25. export CC=$DEVROOT/usr/bin/gcc
  26. export LD=$DEVROOT/usr/bin/ld
  27. export CXX=$DEVROOT/usr/bin/g++
  28. export LIBTOOL=$DEVROOT/usr/bin/libtool
  29. export HOST=i386-apple-darwin
  30.  
  31. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -fPIC"
  32. export LDFLAGS="${COMMONFLAGS} -fPIC"
  33. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  34.  
  35. for ARCH in $ARCHS; do
  36.  
  37. echo "Building $ARCH ......"
  38.  
  39. make clean
  40. ./configure \
  41. --host=i386-apple-darwin \
  42. --sysroot=$SDKROOT \
  43. --prefix="$THIN/$ARCH" \
  44. --extra-cflags="-arch $ARCH -miphoneos-version-min=6.0" \
  45. --extra-ldflags="-L$SDKROOT/usr/lib/system -arch $ARCH -miphoneos-version-min=6.0" \
  46. --enable-pic \
  47. --enable-static \
  48. --disable-asm \
  49. make && make install && make clean
  50.  
  51. echo "Installed: $DEST/$ARCH"
  52. done
  53.  
  54. #x86_64
  55.  
  56. ARCHS="x86_64"
  57.  
  58. unset DEVROOT
  59. unset SDKROOT
  60. unset CC
  61. unset LD
  62. unset CXX
  63. unset LIBTOOL
  64. unset HOST
  65. unset LDFLAGS
  66. unset CFLAGS
  67.  
  68. make clean
  69. for ARCH in $ARCHS; do
  70.  
  71. echo "Building $ARCH ......"
  72.  
  73. ./configure \
  74. --prefix="$THIN/$ARCH" \
  75. --enable-pic \
  76. --enable-static \
  77. --disable-asm \
  78. make && make install && make clean
  79.  
  80. echo "Installed: $DEST/$ARCH"
  81. done
  82.  
  83. #================ iphone ==================
  84.  
  85. export PLATFORM="iPhoneOS"
  86.  
  87. ARCHS="arm64 armv7 armv7s "
  88.  
  89. export DEVROOT=/Applications/Xcode.app/Contents/Developer
  90. export SDKROOT=$DEVROOT/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  91. #DEVPATH=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDK_VERSION}.sdk
  92. export CC=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  93. export AS=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/as
  94. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -marm -fPIC"
  95. export LDFLAGS="${COMMONFLAGS} -fPIC"
  96. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  97. export CXXFLAGS="${COMMONFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden"
  98.  
  99. for ARCH in $ARCHS; do
  100.  
  101. echo "Building $ARCH ......"
  102.  
  103. ./configure \
  104. --host=arm-apple-darwin \
  105. --sysroot=$DEVPATH \
  106. --prefix="$THIN/$ARCH" \
  107. --extra-cflags="-arch $ARCH" \
  108. --extra-ldflags="-L$DEVPATH/usr/lib/system -arch $ARCH" \
  109. --enable-pic \
  110. --enable-static \
  111. --disable-asm
  112.  
  113. make && make install && make clean
  114.  
  115. echo "Installed: $DEST/$ARCH"
  116.  
  117. done
  118.  
  119. cd ..
  120.  
  121. #================ fat lib ===================
  122.  
  123. ARCHS="armv7 armv7s i386 x86_64 arm64"
  124.  
  125. echo "building fat binaries..."
  126. mkdir -p $FAT/lib
  127. set - $ARCHS
  128. CWD=`pwd`
  129. cd $THIN/$1/lib
  130. for LIB in *.a
  131. do
  132. cd $CWD
  133. lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
  134. done
  135.  
  136. cd $CWD
  137. cp -rf $THIN/$1/include $FAT

(2) 第三方库libfaac的编译

这一步用于生成支持armv7、armv7s、arm64、i386、x86_64几种架构的fat版本号的libfaac.a。

以下这个脚本能够首先编译生成上面5种架构的thin版本号的libfaac.a,分成5个目录存储于fat-faac中;然后将这些类库合并成为1个fat版本号的libfaac.a。存储于fat-faac中。

build_faac.sh

  1. #!/bin/sh
  2. cd ./faac
  3. make distclean
  4. cd ..
  5.  
  6. CONFIGURE_FLAGS="--enable-static --with-pic"
  7.  
  8. ARCHS="arm64 armv7s x86_64 i386 armv7"
  9.  
  10. # directories
  11. SOURCE="faac"
  12. FAT="fat-faac"
  13.  
  14. SCRATCH="scratch-faac"
  15. # must be an absolute path
  16. THIN=`pwd`/"thin-faac"
  17.  
  18. COMPILE="y"
  19. LIPO="y"
  20.  
  21. if [ "$*" ]
  22. then
  23. if [ "$*" = "lipo" ]
  24. then
  25. # skip compile
  26. COMPILE=
  27. else
  28. ARCHS="$*"
  29. if [ $# -eq 1 ]
  30. then
  31. # skip lipo
  32. LIPO=
  33. fi
  34. fi
  35. fi
  36.  
  37. if [ "$COMPILE" ]
  38. then
  39. CWD=`pwd`
  40. for ARCH in $ARCHS
  41. do
  42. echo "building $ARCH..."
  43. mkdir -p "$SCRATCH/$ARCH"
  44. cd "$SCRATCH/$ARCH"
  45.  
  46. if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
  47. then
  48. PLATFORM="iPhoneSimulator"
  49. CPU=
  50. if [ "$ARCH" = "x86_64" ]
  51. then
  52. SIMULATOR="-mios-simulator-version-min=7.0"
  53. HOST=
  54. else
  55. SIMULATOR="-mios-simulator-version-min=5.0"
  56. HOST="--host=i386-apple-darwin"
  57. fi
  58. else
  59. PLATFORM="iPhoneOS"
  60. if [ $ARCH = "armv7s" ]
  61. then
  62. CPU="--cpu=swift"
  63. else
  64. CPU=
  65. fi
  66. SIMULATOR=
  67. HOST="--host=arm-apple-darwin"
  68. fi
  69.  
  70. XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
  71. CC="xcrun -sdk $XCRUN_SDK clang -Wno-error=unused-command-line-argument-hard-error-in-future"
  72. AS="/usr/local/bin/gas-preprocessor.pl $CC"
  73. CFLAGS="-arch $ARCH $SIMULATOR"
  74. CXXFLAGS="$CFLAGS"
  75. LDFLAGS="$CFLAGS"
  76.  
  77. CC=$CC CFLAGS=$CXXFLAGS LDFLAGS=$LDFLAGS CPPFLAGS=$CXXFLAGS CXX=$CC CXXFLAGS=$CXXFLAGS $CWD/$SOURCE/configure \
  78. $CONFIGURE_FLAGS \
  79. $HOST \
  80. --prefix="$THIN/$ARCH" \
  81. --disable-shared \
  82. --without-mp4v2
  83.  
  84. make clean && make && make install-strip
  85. cd $CWD
  86. done
  87. fi
  88.  
  89. #================ fat lib ===================
  90.  
  91. echo "building fat binaries..."
  92. mkdir -p $FAT/lib
  93. set - $ARCHS
  94. CWD=`pwd`
  95. cd $THIN/$1/lib
  96. for LIB in *.a
  97. do
  98. cd $CWD
  99. lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
  100. done
  101.  
  102. cd $CWD
  103. cp -rf $THIN/$1/include $FAT

(3) 编译armv7版本号FFmpeg类库

这一步用于生成支持armv7架构的thin版本号的FFmpeg类库,存储于thin-ffmpeg/armv7目录中。脚本例如以下所看到的。

build_ffmpeg_demo_armv7.sh

  1. #!/bin/sh
  2. # LXH,MXY modified
  3.  
  4. cd ffmpeg
  5.  
  6. PLATFORM="iPhoneOS"
  7. INSTALL="thin-ffmpeg"
  8. SDK_VERSION="8.3"
  9.  
  10. # libx264
  11. export X264ROOT=../thin-x264/armv7
  12. export X264LIB=$X264ROOT/lib
  13. export X264INCLUDE=$X264ROOT/include
  14. # libfaac
  15. export FAACROOT=../thin-faac/armv7
  16. export FAACLIB=$FAACROOT/lib
  17. export FAACINCLUDE=$FAACROOT/include
  18.  
  19. export DEVROOT=/Applications/Xcode.app/Contents/Developer
  20.  
  21. export SDKROOT=$DEVROOT/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  22. export CC=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  23. export AS=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/as
  24.  
  25. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -marm -fPIC"
  26. export LDFLAGS="${COMMONFLAGS} -fPIC"
  27. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  28. export CXXFLAGS="${COMMONFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden"
  29.  
  30. echo "Building armv7..."
  31.  
  32. make clean
  33. ./configure \
  34. --cpu=cortex-a9 \
  35. --extra-cflags='-I$X264INCLUDE -I$FAACINCLUDE -arch armv7 -miphoneos-version-min=5.0 -mthumb' \
  36. --extra-ldflags='-L$X264LIB -L$FAACLIB -arch armv7 -miphoneos-version-min=5.0' \
  37. --enable-cross-compile \
  38. --arch=arm --disable-iconv\
  39. --target-os=darwin \
  40. --cc=${CC} --disable-asm\
  41. --sysroot=${SDKROOT} \
  42. --prefix=../${INSTALL}/armv7 \
  43. --enable-gpl --enable-nonfree --enable-version3 --disable-bzlib --enable-small --disable-vda \
  44. --disable-encoders --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=libfaac \
  45. --disable-muxers --enable-muxer=flv --enable-muxer=mov --enable-muxer=ipod --enable-muxer=mpegts --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi \
  46. --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 \
  47. --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=mpegts --enable-demuxer=avi --enable-demuxer=mpc --enable-demuxer=mov \
  48. --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 \
  49. --disable-protocols --enable-protocol=file --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=udp \
  50. --disable-bsfs --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb \
  51. --disable-devices --disable-debug --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-ffserver --disable-debug
  52.  
  53. make
  54. make install
  55.  
  56. cd ..

(4) 编译armv7s版本号FFmpeg类库

这一步用于生成支持armv7s架构的thin版本号的FFmpeg类库,存储于thin-ffmpeg/armv7s目录中。脚本例如以下所看到的。

build_ffmpeg_demo_armv7s.sh

  1. #!/bin/sh
  2. # LXH,MXY modified
  3.  
  4. cd ffmpeg
  5.  
  6. PLATFORM="iPhoneOS"
  7. INSTALL="thin-ffmpeg"
  8. SDK_VERSION="8.3"
  9.  
  10. # libx264
  11. export X264ROOT=../thin-x264/armv7s
  12. export X264LIB=$X264ROOT/lib
  13. export X264INCLUDE=$X264ROOT/include
  14. # libfaac
  15. export FAACROOT=../thin-faac/armv7s
  16. export FAACLIB=$FAACROOT/lib
  17. export FAACINCLUDE=$FAACROOT/include
  18.  
  19. export DEVROOT=/Applications/Xcode.app/Contents/Developer
  20.  
  21. export SDKROOT=$DEVROOT/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  22. export CC=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  23. export AS=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/as
  24.  
  25. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -marm -fPIC"
  26. export LDFLAGS="${COMMONFLAGS} -fPIC"
  27. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  28. export CXXFLAGS="${COMMONFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden"
  29.  
  30. echo "Building armv7s..."
  31.  
  32. make clean
  33. ./configure \
  34. --cpu=cortex-a9 \
  35. --extra-cflags='-I$X264INCLUDE -I$FAACINCLUDE -arch armv7s -miphoneos-version-min=5.0 -mthumb' \
  36. --extra-ldflags='-L$X264LIB -L$FAACLIB -arch armv7s -miphoneos-version-min=5.0' \
  37. --enable-cross-compile \
  38. --arch=arm --disable-iconv\
  39. --target-os=darwin \
  40. --cc=${CC} --disable-asm \
  41. --sysroot=${SDKROOT} \
  42. --prefix=../${INSTALL}/armv7s \
  43. --enable-gpl --enable-nonfree --enable-version3 --disable-bzlib --enable-small --disable-vda \
  44. --disable-encoders --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=libfaac \
  45. --disable-muxers --enable-muxer=flv --enable-muxer=mov --enable-muxer=ipod --enable-muxer=mpegts --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi \
  46. --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 \
  47. --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=avi --enable-demuxer=mpegts --enable-demuxer=mpc --enable-demuxer=mov \
  48. --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 \
  49. --disable-protocols --enable-protocol=file --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=udp \
  50. --disable-bsfs --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb \
  51. --disable-devices --disable-debug --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-ffserver --disable-debug
  52.  
  53. make
  54. make install
  55.  
  56. cd ..

(5) 编译arm64版本号FFmpeg类库

这一步用于生成支持arm64架构的thin版本号的FFmpeg类库,存储于thin-ffmpeg/arm64目录中。

脚本例如以下所看到的。

build_ffmpeg_demo_arm64.sh

  1. #!/bin/sh
  2. # LXH,MXY modified
  3.  
  4. cd ffmpeg
  5.  
  6. PLATFORM="iPhoneOS"
  7. INSTALL="thin-ffmpeg"
  8. SDK_VERSION="8.3"
  9.  
  10. # libx264
  11. export X264ROOT=../thin-x264/arm64
  12. export X264LIB=$X264ROOT/lib
  13. export X264INCLUDE=$X264ROOT/include
  14. # libfaac
  15. export FAACROOT=../thin-faac/arm64
  16. export FAACLIB=$FAACROOT/lib
  17. export FAACINCLUDE=$FAACROOT/include
  18.  
  19. export DEVROOT=/Applications/Xcode.app/Contents/Developer
  20.  
  21. export SDKROOT=$DEVROOT/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  22. export CC=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  23. export AS=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/as
  24.  
  25. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -marm -fPIC"
  26. export LDFLAGS="${COMMONFLAGS} -fPIC"
  27. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  28. export CXXFLAGS="${COMMONFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden"
  29.  
  30. echo "Building arm64..."
  31.  
  32. make clean
  33. ./configure \
  34. --extra-cflags='-I$X264INCLUDE -I$FAACINCLUDE -arch arm64 -miphoneos-version-min=5.0 -mthumb' \
  35. --extra-ldflags='-L$X264LIB -L$FAACLIB -arch arm64 -miphoneos-version-min=5.0' \
  36. --enable-cross-compile \
  37. --arch=arm --disable-iconv \
  38. --target-os=darwin \
  39. --cc=${CC} --disable-asm \
  40. --sysroot=${SDKROOT} \
  41. --prefix=../${INSTALL}/arm64 \
  42. --enable-gpl --enable-nonfree --enable-version3 --disable-bzlib --enable-small --disable-vda \
  43. --disable-encoders --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=libfaac \
  44. --disable-muxers --enable-muxer=flv --enable-muxer=mov --enable-muxer=ipod --enable-muxer=mpegts --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi \
  45. --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 \
  46. --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=avi --enable-demuxer=mpegts --enable-demuxer=mpc --enable-demuxer=mov \
  47. --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 \
  48. --disable-protocols --enable-protocol=file --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=udp \
  49. --disable-bsfs --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb \
  50. --disable-devices --disable-debug --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-ffserver --disable-debug
  51.  
  52. make
  53. make install
  54.  
  55. cd ..

(6) 编译i386版本号FFmpeg类库

这一步用于生成支持i386架构的thin版本号的FFmpeg类库。存储于thin-ffmpeg/i386目录中。

脚本例如以下所看到的。

build_ffmpeg_demo_i386.sh

  1. #!/bin/sh
  2. # LXH,MXY modified
  3.  
  4. cd ffmpeg
  5.  
  6. PLATFORM="iPhoneSimulator"
  7. INSTALL="thin-ffmpeg"
  8. SDK_VERSION="8.3"
  9.  
  10. # libx264
  11. export X264ROOT=../thin-x264/i386
  12. export X264LIB=$X264ROOT/lib
  13. export X264INCLUDE=$X264ROOT/include
  14. # libfaac
  15. export FAACROOT=../thin-faac/i386
  16. export FAACLIB=$FAACROOT/lib
  17. export FAACINCLUDE=$FAACROOT/include
  18.  
  19. export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
  20. export SDKROOT=$DEVROOT/SDKs/${PLATFORM}${SDK_VERSION}.sdk
  21. export CC=$DEVROOT/usr/bin/gcc
  22. export LD=$DEVROOT/usr/bin/ld
  23.  
  24. export CXX=$DEVROOT/usr/bin/g++
  25.  
  26. export LIBTOOL=$DEVROOT/usr/bin/libtool
  27.  
  28. COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -fPIC"
  29. export LDFLAGS="${COMMONFLAGS} -fPIC"
  30. export CFLAGS="${COMMONFLAGS} -fvisibility=hidden"
  31.  
  32. echo "Building i386..."
  33. make clean
  34. ./configure \
  35. --cpu=i386 \
  36. --extra-cflags='-I$X264INCLUDE -I$FAACINCLUDE -arch i386 -miphoneos-version-min=5.0' \
  37. --extra-ldflags='-L$X264LIB -L$FAACLIB -arch i386 -miphoneos-version-min=5.0' \
  38. --enable-cross-compile \
  39. --arch=i386 --disable-iconv \
  40. --target-os=darwin \
  41. --cc=${CC} \
  42. --sysroot=${SDKROOT} \
  43. --prefix=../${INSTALL}/i386 \
  44. --enable-gpl --enable-nonfree --enable-version3 --disable-bzlib --enable-small --disable-vda \
  45. --disable-encoders --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=libfaac \
  46. --disable-muxers --enable-muxer=flv --enable-muxer=mov --enable-muxer=mpegts --enable-muxer=ipod --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi \
  47. --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 \
  48. --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=mpegts --enable-demuxer=avi --enable-demuxer=mpc --enable-demuxer=mov \
  49. --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 \
  50. --disable-protocols --enable-protocol=file --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=udp \
  51. --disable-bsfs --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb \
  52. --disable-devices --disable-debug --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-ffserver --disable-debug
  53.  
  54. make
  55. make install
  56.  
  57. cd ..

(7) 编译x86_64版本号FFmpeg类库

这一步用于生成支持x86_64架构的thin版本号的FFmpeg类库。存储于thin-ffmpeg/x86_64目录中。脚本例如以下所看到的。

build_ffmpeg_demo_x86_64.sh

  1. #!/bin/sh
  2. # LXH,MXY modified
  3.  
  4. cd ./ffmpeg
  5.  
  6. INSTALL="thin-ffmpeg"
  7.  
  8. # libx264
  9. export X264ROOT=../thin-x264/x86_64
  10. export X264LIB=$X264ROOT/lib
  11. export X264INCLUDE=$X264ROOT/include
  12. # libfaac
  13. export FAACROOT=../thin-faac/x86_64
  14. export FAACLIB=$FAACROOT/lib
  15. export FAACINCLUDE=$FAACROOT/include
  16.  
  17. unset DEVROOT
  18. unset SDKROOT
  19. unset CC
  20. unset LD
  21. unset CXX
  22. unset LIBTOOL
  23. unset HOST
  24. unset LDFLAGS
  25. unset CFLAGS
  26.  
  27. echo "Building x86_64..."
  28.  
  29. make clean
  30. ./configure \
  31. --extra-cflags='-I$X264INCLUDE -I$FAACINCLUDE' \
  32. --extra-ldflags='-L$X264LIB -L$FAACLIB' \
  33. --disable-iconv \
  34. --disable-asm \
  35. --prefix=../${INSTALL}/x86_64 \
  36. --enable-gpl --enable-nonfree --enable-version3 --disable-bzlib --enable-small --disable-vda \
  37. --disable-encoders --enable-libx264 --enable-libfaac --enable-encoder=libx264 --enable-encoder=mpeg2video --enable-encoder=libfaac \
  38. --disable-muxers --enable-muxer=flv --enable-muxer=mov --enable-muxer=ipod --enable-muxer=mpegts --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi \
  39. --disable-decoders --enable-decoder=aac --enable-decoder=mpeg2video --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 \
  40. --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=avi --enable-demuxer=mpegts --enable-demuxer=mpc --enable-demuxer=mov \
  41. --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 \
  42. --disable-protocols --enable-protocol=file --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=udp \
  43. --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb \
  44. --disable-devices --disable-debug --disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-ffserver --disable-debug
  45.  
  46. make
  47. make install
  48. cd ..

(8) 打包类库

这一步用于将上述步骤中生成的5个版本号的FFmpeg打包生成fat版本号的FFmpeg类库。这一步骤执行完成后,将thin-ffmpeg中几个thin版本号的类库合并为一个fat版本号的类库。并存储于fat-ffmpeg目录中。

脚本例如以下所看到的。

build_ffmpeg_fat.sh

  1. #!/bin/sh
  2.  
  3. # directories
  4. THIN=`pwd`/"thin-ffmpeg"
  5. FAT=`pwd`/"fat-ffmpeg"
  6. CWD=`pwd`
  7. # must be an absolute path
  8.  
  9. ARCHS="armv7s i386 armv7 arm64 x86_64"
  10.  
  11. echo "building fat binaries..."
  12.  
  13. mkdir -p $FAT/lib
  14. set - $ARCHS
  15. cd thin-ffmpeg/$1/lib
  16. for LIB in *.a
  17. do
  18. cd $CWD
  19. lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
  20. done
  21.  
  22. cd $CWD
  23. cp -rf $THIN/$1/include $FAT

生成完fat版本号的类库后,能够在命令行使用lipo命令查看类库的架构,例如以下所看到的。

  1. lipo -info libavcodec.a

2. 编写IOS程序

编写包括FFmpeg类库支持的IOS程序分成两步:配置Xcode环境,编写C语言代码。

(1) 配置Xcode环境

以下以Xcode的IOS中的Single View Application为例。记录一下配置步骤:

(a) 拷贝头文件所在的include目录和fat版本号的FFmpeg类库(包括libavformat.a, libavcodec.a, libavutil.a, libavdevice.a, libavfilter.a。 libpostproc.a。 libswresample.a, libswscale.a;以及第三方fat版本号类库libx264.a, libfaac.a)至项目目录。并将它们加入至项目中。

(b) 项目属性->Build Settings中配置以下3个选项。

Linking->Other Linker Flags中加入以下内容:

  1. -lavformat
  2. -lavcodec
  3. -lavutil
  4. -lavdevice
  5. -lavfilter
  6. -lpostproc
  7. -lswresample
  8. -lswscale
  9. -lx264
  10. -lfaac

Search Paths->Header Search Paths加入以下内容

  1. $(PROJECT_DIR)/include

Search Paths->Library Search Paths加入以下内容

  1. $(PROJECT_DIR)

其他的一些配置。这些配置随着FFmpeg版本号的不同而有稍微的不同(在某些情况下也可能不须要配置)。

我眼下使用的2.7.1版本号的FFmpeg须要配置以下的选项。
项目属性->General->Linked Frameworks and Libraries中加入两个类库:AVFoundation.framework和libz.dylib。

(2) 编写C语言代码

做好上面配置后。就能够在项目中编写代码測试一下FFmpeg是否正确配置了。

因为IOS使用的Objective-C是兼容C语言的。所以能够直接写C语言代码调用FFmpeg。能够在ViewController.m中的viewDidLoad()函数中加入一行printf()代码打印FFmpeg类库的版本号信息。例如以下所看到的。

  1. #import "ViewController.h"
  2. #include <libavcodec/avcodec.h>
  3.  
  4. @interface ViewController ()
  5.  
  6. @end
  7.  
  8. @implementation ViewController
  9.  
  10. - (void)viewDidLoad {
  11. [super viewDidLoad];
  12. // Do any additional setup after loading the view, typically from a nib.
  13. printf("%s",avcodec_configuration());
  14. }
  15.  
  16. - (void)didReceiveMemoryWarning {
  17. [super didReceiveMemoryWarning];
  18. // Dispose of any resources that can be recreated.
  19. }
  20.  
  21. @end

假设类库编译无误。启动IOS程序的时候会在控制台打印版本号信息。

源码

项目的目录结构如图所看到的。

C代码位于ViewController.m文件里。内容例如以下所看到的。

  1. /**
  2. * 最简单的基于FFmpeg的HelloWorld程序 - IOS
  3. * Simplest FFmpeg Helloworld - IOS
  4. *
  5. * 雷霄骅 Lei Xiaohua
  6. * leixiaohua1020@126.com
  7. * 中国传媒大学/数字电视技术
  8. * Communication University of China / Digital TV Technology
  9. * http://blog.csdn.net/leixiaohua1020
  10. *
  11. * 本程序能够获得FFmpeg类库相关的信息。
  12. * This software can get information about FFmpeg libraries.
  13. *
  14. */
  15.  
  16. #import "ViewController.h"
  17. #include <libavcodec/avcodec.h>
  18. #include <libavformat/avformat.h>
  19. #include <libavfilter/avfilter.h>
  20.  
  21. @interface ViewController ()
  22.  
  23. @end
  24.  
  25. @implementation ViewController
  26.  
  27. - (void)viewDidLoad {
  28. [super viewDidLoad];
  29. // Do any additional setup after loading the view, typically from a nib.
  30.  
  31. av_register_all();
  32. char info[10000] = { 0 };
  33. printf("%s\n", avcodec_configuration());
  34. sprintf(info, "%s\n", avcodec_configuration());
  35. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  36. self.content.text=info_ns;
  37. }
  38.  
  39. - (void)didReceiveMemoryWarning {
  40. [super didReceiveMemoryWarning];
  41. // Dispose of any resources that can be recreated.
  42. }
  43.  
  44. - (IBAction)clickProtocolButton:(id)sender {
  45. //Alert
  46. /*
  47. UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"Title" message:@"This is content" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
  48. [alter show];
  49. */
  50. char info[40000]={0};
  51. av_register_all();
  52.  
  53. struct URLProtocol *pup = NULL;
  54. //Input
  55. struct URLProtocol **p_temp = &pup;
  56. avio_enum_protocols((void **)p_temp, 0);
  57. while ((*p_temp) != NULL){
  58. sprintf(info, "%s[In ][%10s]\n", info, avio_enum_protocols((void **)p_temp, 0));
  59. }
  60. pup = NULL;
  61. //Output
  62. avio_enum_protocols((void **)p_temp, 1);
  63. while ((*p_temp) != NULL){
  64. sprintf(info, "%s[Out][%10s]\n", info, avio_enum_protocols((void **)p_temp, 1));
  65. }
  66. //printf("%s", info);
  67. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  68. self.content.text=info_ns;
  69. }
  70.  
  71. - (IBAction)clickAVFormatButton:(id)sender {
  72. char info[40000] = { 0 };
  73.  
  74. av_register_all();
  75.  
  76. AVInputFormat *if_temp = av_iformat_next(NULL);
  77. AVOutputFormat *of_temp = av_oformat_next(NULL);
  78. //Input
  79. while(if_temp!=NULL){
  80. sprintf(info, "%s[In ]%10s\n", info, if_temp->name);
  81. if_temp=if_temp->next;
  82. }
  83. //Output
  84. while (of_temp != NULL){
  85. sprintf(info, "%s[Out]%10s\n", info, of_temp->name);
  86. of_temp = of_temp->next;
  87. }
  88. //printf("%s", info);
  89. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  90. self.content.text=info_ns;
  91. }
  92.  
  93. - (IBAction)clickAVCodecButton:(id)sender {
  94.  
  95. char info[40000] = { 0 };
  96.  
  97. av_register_all();
  98.  
  99. AVCodec *c_temp = av_codec_next(NULL);
  100.  
  101. while(c_temp!=NULL){
  102. if (c_temp->decode!=NULL){
  103. sprintf(info, "%s[Dec]", info);
  104. }
  105. else{
  106. sprintf(info, "%s[Enc]", info);
  107. }
  108. switch (c_temp->type){
  109. case AVMEDIA_TYPE_VIDEO:
  110. sprintf(info, "%s[Video]", info);
  111. break;
  112. case AVMEDIA_TYPE_AUDIO:
  113. sprintf(info, "%s[Audio]", info);
  114. break;
  115. default:
  116. sprintf(info, "%s[Other]", info);
  117. break;
  118. }
  119. sprintf(info, "%s%10s\n", info, c_temp->name);
  120.  
  121. c_temp=c_temp->next;
  122. }
  123. //printf("%s", info);
  124. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  125. self.content.text=info_ns;
  126. }
  127.  
  128. - (IBAction)clickAVFilterButton:(id)sender {
  129. char info[40000] = { 0 };
  130. avfilter_register_all();
  131. AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
  132. while (f_temp != NULL){
  133. sprintf(info, "%s[%10s]\n", info, f_temp->name);
  134. }
  135. //printf("%s", info);
  136. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  137. self.content.text=info_ns;
  138. }
  139.  
  140. - (IBAction)clickConfigurationButton:(id)sender {
  141. char info[10000] = { 0 };
  142. av_register_all();
  143.  
  144. sprintf(info, "%s\n", avcodec_configuration());
  145.  
  146. //printf("%s", info);
  147. //self.content.text=@"Lei Xiaohua";
  148. NSString * info_ns = [NSString stringWithFormat:@"%s", info];
  149. self.content.text=info_ns;
  150. }
  151.  
  152. @end

执行结果

App在手机上执行后的结果例如以下图所看到的。

单击不同的button,能够得到类库不同方面的信息。单击“Protocol”button内容例如以下所看到的。

单击“AVFormat”button内容例如以下所看到的。

 

单击“AVCodec”button内容例如以下所看到的。

 

单击“Configure”button即为程序開始执行时候的内容。

下载

simplest ffmpeg mobile

项目主页

Github:https://github.com/leixiaohua1020/simplest_ffmpeg_mobile

开源中国:https://git.oschina.net/leixiaohua1020/simplest_ffmpeg_mobile

SourceForge:https://sourceforge.net/projects/simplestffmpegmobile/

CSDN工程下载地址:http://download.csdn.net/detail/leixiaohua1020/8924391

本解决方式包括了使用FFmpeg在移动端处理多媒体的各种样例:

[Android]
simplest_android_player: 基于安卓接口的视频播放器
simplest_ffmpeg_android_helloworld: 安卓平台下基于FFmpeg的HelloWorld程序
simplest_ffmpeg_android_decoder: 安卓平台下最简单的基于FFmpeg的视频解码器
simplest_ffmpeg_android_decoder_onelib: 安卓平台下最简单的基于FFmpeg的视频解码器-单库版
simplest_ffmpeg_android_streamer: 安卓平台下最简单的基于FFmpeg的推流器
simplest_ffmpeg_android_transcoder: 安卓平台下移植的FFmpeg命令行工具
simplest_sdl_android_helloworld: 移植SDL到安卓平台的最简单程序
[IOS]
simplest_ios_player: 基于IOS接口的视频播放器
simplest_ffmpeg_ios_helloworld: IOS平台下基于FFmpeg的HelloWorld程序
simplest_ffmpeg_ios_decoder: IOS平台下最简单的基于FFmpeg的视频解码器
simplest_ffmpeg_ios_streamer: IOS平台下最简单的基于FFmpeg的推流器
simplest_ffmpeg_ios_transcoder: IOS平台下移植的ffmpeg.c命令行工具
simplest_sdl_ios_helloworld: 移植SDL到IOS平台的最简单程序

最简单的基于FFmpeg的移动端样例:IOS HelloWorld的更多相关文章

  1. 最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  2. 最简单的基于FFmpeg的移动端样例:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  3. 最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  4. 最简单的基于FFmpeg的移动端样例附件:SDL Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  5. 最简单的基于FFmpeg的移动端样例:IOS 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  6. 最简单的基于FFmpeg的移动端样例:Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  7. 最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  8. 最简单的基于FFmpeg的移动端样例:IOS 推流器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  9. 最简单的基于FFmpeg的移动端样例:Android 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

随机推荐

  1. 根证书 CA

    根证书 CA 密钥没有密码,使用下面的指令添加密码 openssl rsa -aes256 -in cakey_nopw.pem -out cakey_pw.pem cacert.pem -----B ...

  2. 给Linux设置SSH登录邮件提醒

    给Linux设置SSH登录邮件提醒 心血来潮,用 last 命令查看了登录记录,不看不知道,一看就有问题.竟然有两个陌生的IP ,一个是美国欧莱雅的,一个是北京联通的.真是郁闷,密码简单了真不行 后来 ...

  3. js04---object1

    我们目前为止大多数引用类型都是Object类型的实例,Object也是ECMAScript中使用最多的一种类型(就像java.lang.Object一样,Object类型是所有它的实例的基础).Obj ...

  4. Flume的Storage&Master

    storage是存储系统,可以是一个普通file,也可以是HDFS,HIVE,HBase,分布式存储等. Master是管理协调Agent和Collector的配置等信息,是flume集群的控制器.

  5. Red Hat Enterprise Linux Server 5.5新增功能简介

    一.概况 昨日对刚发布的redhat新产品RHEL5.5进行了小范围的测试,红帽企业版 Linux 5.5 发行本中的亮点包括针对 Intel Boxboro-EX 平台.AMD Magny-Cour ...

  6. BZOJ4817: [Sdoi2017]树点涂色(LCT)

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  7. 计算两个String 类型的时间相关几个月

    /** * 返回两个时间段相隔几个月 * @param date1 * @param date2 * @return * @throws ParseException * @throws ParseE ...

  8. 内网使用 IPV6 之 TunnelBroker隧道(6in4)篇

    内网使用 IPV6 之 TunnelBroker隧道(6in4)篇 据非专业网民推测 tunnelbroker isatap 和 6to4  貌似都需要公网,但有网民测试这位大作的方法可行.特别之处是 ...

  9. Django环境搭建(一)

    搭建Django环境之前先搭建python运行环境 需要了解: 解释器(编译器): 计算机不能直接理解任何除机器语言外的其他语言,所以程序员必须要把自己写的语言翻译成机器语言,而将其他语言翻译成机器语 ...

  10. Eclipse Class Decompiler——Java反编译插件手工配置方法

    最近在eclipse上配置了java反编译插件,但是不好用,原因是我的eclipse之前有手动配置过一些类似的java反编译插件,当我将原来的插件完全卸载后重新配置才正常配置上去,自动配置java反编 ...