build-ffmpeg-iOS-framework.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/bin/sh
  2. # directories
  3. SCRATCH=`pwd`/"scratch"
  4. ARCHS="arm64 armv7 i386 x86_64"
  5. FFMPEG_VERSION="3.4"
  6. export FFMPEG_VERSION
  7. HEADER_SUFFIX=".h"
  8. CURRENT_FOLDER=`pwd`
  9. FRAMEWORK_NAME="FFmpeg"
  10. FRAMEWORK_EXT=".framework"
  11. FRAMEWORK="$FRAMEWORK_NAME$FRAMEWORK_EXT"
  12. BUILD_FOLDER="$CURRENT_FOLDER/FFmpeg-iOS"
  13. BUILD_THIN_FOLDER="$CURRENT_FOLDER/thin"
  14. BUILD_INCLUDE_FOLDER="$BUILD_FOLDER/include"
  15. BUILD_LIB_FOLDER="$BUILD_FOLDER/lib"
  16. OUTPUT_FOLDER="$CURRENT_FOLDER/$FRAMEWORK"
  17. OUTPUT_INFO_PLIST_FILE="$OUTPUT_FOLDER/Info.plist"
  18. OUTPUT_HEADER_FOLDER="$OUTPUT_FOLDER/Headers"
  19. OUTPUT_UMBRELLA_HEADER="$OUTPUT_HEADER_FOLDER/ffmpeg.h"
  20. OUTPUT_MODULES_FOLDER="$OUTPUT_FOLDER/Modules"
  21. OUTPUT_MODULES_FILE="$OUTPUT_MODULES_FOLDER/module.modulemap"
  22. VERSION_NEW_NAME="Version.h"
  23. BUNDLE_ID="org.ffmpeg.FFmpeg"
  24. function CreateFramework() {
  25. rm -rf $OUTPUT_FOLDER
  26. mkdir -p $OUTPUT_HEADER_FOLDER $OUTPUT_MODULES_FOLDER
  27. }
  28. function CompileSource() {
  29. ./build-ffmpeg.sh $ARCHS
  30. ./build-ffmpeg.sh lipo
  31. }
  32. function MergeStaticLibrary() {
  33. local files=""
  34. for ARCH in $ARCHS; do
  35. folder="$SCRATCH/$ARCH"
  36. name="$FRAMEWORK_NAME$ARCH.a"
  37. ar cru $name $(find $folder -name "*.o")
  38. files="$files $name"
  39. done
  40. lipo -create $files -output FFmpeg
  41. for file in $files; do
  42. rm -rf $file
  43. done
  44. mv $FRAMEWORK_NAME $OUTPUT_FOLDER
  45. }
  46. function RenameHeader() {
  47. local include_folder="$(pwd)/FFmpeg-iOS/include"
  48. local need_replace_version_folder=""
  49. for folder in "$include_folder"/*; do
  50. local folder_name=`basename $folder`
  51. local verstion_file_name="$folder_name$VERSION_NEW_NAME"
  52. for header in "$folder"/*; do
  53. local header_name=`basename $header`
  54. local dst_name=$header_name
  55. if [ $header_name == "version.h" ]; then
  56. dst_name=$verstion_file_name
  57. fi
  58. local dst_folder=$OUTPUT_HEADER_FOLDER
  59. local file_name="$folder/$header_name"
  60. local dst_file_name="$dst_folder/$dst_name"
  61. cp $file_name $dst_file_name
  62. find "$dst_folder" -name "$dst_name" -type f -exec sed -i '' "s/\"version.h\"/\"$verstion_file_name\"/g" {} \;
  63. done
  64. need_replace_version_folder="$need_replace_version_folder $folder_name"
  65. done
  66. for folder_name in $need_replace_version_folder; do
  67. local verstion_file_name="$folder_name$VERSION_NEW_NAME"
  68. find $OUTPUT_HEADER_FOLDER -type f -exec sed -i '' "s/\"$folder_name\/version.h\"/\"$verstion_file_name\"/g" {} \;
  69. done
  70. find $OUTPUT_HEADER_FOLDER -type f -exec sed -i '' "s/libavformat\///g" {} \;
  71. find $OUTPUT_HEADER_FOLDER -type f -exec sed -i '' "s/libavutil\///g" {} \;
  72. find $OUTPUT_HEADER_FOLDER -type f -exec sed -i '' "s/libavcodec\///g" {} \;
  73. }
  74. # COPY MISSING inttypes.h
  75. function CopyInttype() {
  76. local file="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/clang/include/inttypes.h"
  77. cp $file $OUTPUT_HEADER_FOLDER
  78. find $OUTPUT_HEADER_FOLDER -type f -exec sed -i '' "s/<inttypes.h>/\"inttypes.h\"/g" {} \;
  79. }
  80. function CreateModulemapAndUmbrellaHeader() {
  81. #create ffmpeg.h
  82. cat > $OUTPUT_UMBRELLA_HEADER <<EOF
  83. #import <Foundation/Foundation.h>
  84. #import <VideoToolbox/VideoToolbox.h>
  85. #import <AudioToolbox/AudioToolbox.h>
  86. #include "avcodec.h"
  87. #include "avdevice.h"
  88. #include "avfilter.h"
  89. #include "avformat.h"
  90. #include "avutil.h"
  91. #include "swscale.h"
  92. #include "swresample.h"
  93. double FFmpegVersionNumber = $FFMPEG_VERSION;
  94. EOF
  95. cat > $OUTPUT_MODULES_FILE <<EOF
  96. framework module $FRAMEWORK_NAME {
  97. umbrella header "ffmpeg.h"
  98. export *
  99. module * { export * }
  100. }
  101. EOF
  102. }
  103. function CreateInfoPlist() {
  104. DEFAULT_iOS_SDK_VERSION=`defaults read $(xcode-select -p)/Platforms/iPhoneOS.platform/version CFBundleShortVersionString`
  105. DTCompiler=`defaults read $(xcode-select -p)/../info DTCompiler`
  106. DTPlatformBuild=`defaults read $(xcode-select -p)/../info DTPlatformBuild`
  107. DTSDKBuild=`defaults read $(xcode-select -p)/../info DTSDKBuild`
  108. DTXcode=`defaults read $(xcode-select -p)/../info DTXcode`
  109. DTXcodeBuild=`defaults read $(xcode-select -p)/../info DTXcodeBuild`
  110. OS_BUILD_VERSION=$(sw_vers -buildVersion)
  111. cat > $OUTPUT_INFO_PLIST_FILE <<EOF
  112. <?xml version="1.0" encoding="UTF-8"?>
  113. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  114. <plist version="1.0">
  115. <dict>
  116. <key>BuildMachineOSBuild</key>
  117. <string>$OS_BUILD_VERSION</string>
  118. <key>CFBundleDevelopmentRegion</key>
  119. <string>en</string>
  120. <key>CFBundleExecutable</key>
  121. <string>$FRAMEWORK_NAME</string>
  122. <key>CFBundleIdentifier</key>
  123. <string>$BUNDLE_ID</string>
  124. <key>CFBundleInfoDictionaryVersion</key>
  125. <string>6.0</string>
  126. <key>CFBundleName</key>
  127. <string>$FRAMEWORK_NAME</string>
  128. <key>CFBundlePackageType</key>
  129. <string>FMWK</string>
  130. <key>CFBundleShortVersionString</key>
  131. <string>$FFMPEG_VERSION</string>
  132. <key>CFBundleSignature</key>
  133. <string>????</string>
  134. <key>CFBundleSupportedPlatforms</key>
  135. <array>
  136. <string>iPhoneOS</string>
  137. </array>
  138. <key>CFBundleVersion</key>
  139. <string>1</string>
  140. <key>DTCompiler</key>
  141. <string>$DTCompiler</string>
  142. <key>DTPlatformBuild</key>
  143. <string>$DTPlatformBuild</string>
  144. <key>DTPlatformName</key>
  145. <string>iphoneos</string>
  146. <key>DTPlatformVersion</key>
  147. <string>$DEFAULT_iOS_SDK_VERSION</string>
  148. <key>DTSDKBuild</key>
  149. <string>$DTSDKBuild</string>
  150. <key>DTSDKName</key>
  151. <string>iphoneos$DEFAULT_iOS_SDK_VERSION</string>
  152. <key>DTXcode</key>
  153. <string>$DTXcode</string>
  154. <key>DTXcodeBuild</key>
  155. <string>$DTXcodeBuild</string>
  156. <key>MinimumOSVersion</key>
  157. <string>8.0</string>
  158. <key>UIDeviceFamily</key>
  159. <array>
  160. <integer>1</integer>
  161. <integer>2</integer>
  162. </array>
  163. </dict>
  164. </plist>
  165. EOF
  166. }
  167. CompileSource
  168. CreateFramework
  169. MergeStaticLibrary
  170. RenameHeader
  171. CreateModulemapAndUmbrellaHeader
  172. CopyInttype
  173. CreateInfoPlist