FFMPEG integration on iphone/ ipad project

14,098

Prerequisites

MacPorts to install:open terminal and type

sudo port install pkgconfig

Launch Terminal and download FFmpeg source

The location of the directory is up to your personal preference and I chose to save it in a ffmpeg folder under my Home folder for easy access later on.

git clone git://source.ffmpeg.org/ffmpeg.git ~/ffmpeg

Before we go further, we need to think ahead and realize that we are likely to do some simulation on Mac itself along with actual testing on iPhone. What we need to do is that we need to build libraries for 3 architectures: armv7 (iPhone 3Gs or later), armv7s (iPhone 5) and i386 (iPhone Simulator).

Let’s create some folders inside ffmpeg folder to hold 3 different builds so that we can lipo those together into one universal build.

cd ffmpeg mkdir armv7 mkdir armv7s mkdir i386 mkdir -p universal/lib

To Install gas-preprocessor

  1. Click on the ZIP icon to download gas-preprocessor.
  2. Copy gas-preprocessor.pl to /usr/bin directory.
  3. Change permission of gas-preprocessor.pl by setting the privilege to Read & Write for all.

Configure FFmpeg for armv7 build

Before configuring, You may refer to the detailed options by going in to the ffmpeg folder and type:

./configure --help

list of options for your reference: FFmpeg Configure Options. The “Components options” will be up to you depending on what you want to do with FFmpeg.

Now run the following configure options:

./configure \ --prefix=armv7 \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --enable-avresample \ --enable-cross-compile \ --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk" \ --target-os=darwin \ --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc" \ --extra-cflags="-arch armv7 -mfpu=neon -miphoneos-version-min=6.0" \ --extra-ldflags="-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk -miphoneos-version-min=6.0" \ --arch=arm \ --cpu=cortex-a9 \ --enable-pic \

You may get a warning such as:

WARNING: Compiler does not indicate floating-point ABI, guessing soft.

No worries. You should be fine to continue to next steps.

Build FFmpeg for armv7

Run the build commands:

make clean && make && make install

Now you should be able to see files are populated inside the ffmpeg/armv7 folder. We now move onto building for armv7s for iPhone 5.

Configure and Install FFmpeg for armv7s architecture (iPhone 5)

. /configure \ --prefix=armv7s \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --enable-avresample \ --enable-cross-compile \ --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk" \ --target-os=darwin \ --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc" \ --extra-cflags="-arch armv7s -mfpu=neon -miphoneos-version-min=6.0" \ --extra-ldflags="-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk -miphoneos-version-min=6.0" \ --arch=arm \ --cpu=cortex-a9 \ --enable-pic \

Then build with:

make clean && make && make install

Configure FFmpeg for i386 build

./configure \ --prefix=i386 \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --enable-avresample \ --enable-cross-compile \ --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk" \ --target-os=darwin \ --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc" \ --extra-cflags="-arch i386" \ --extra-ldflags="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk" \ --arch=i386 \ --cpu=i386 \ --enable-pic \ --disable-asm \

Please note the last --disable-asm tag. If you forget to include this tag, you will likely to receive this error:

cc1: error in backend: Ran out of registers during register allocation! make: *** [libavcodec/h264_cabac.o] Error 1

Build FFmpeg for i386

make clean && make && make install

Create universal library

The lipo commands (assuming you are still under the ffmpeg folder): (Please note that Mountain Lion-supplied lipo knows nothing about armv7s as of yet. So we need to use xcrun to find the lipo supplied with the SDK.)

cd armv7/lib for file in *.a do cd ../.. xcrun -sdk iphoneos lipo -output universal/lib/$file -create \ -arch armv7 armv7/lib/$file \ -arch armv7s armv7s/lib/$file \ -arch i386 i386/lib/$file echo "Universal $file created." cd - done cd ../..

Look under universal/lib, you will find all FAT libs freshly baked there. We now turn our attention to linking these static libraries to the Xcode project.

if you are getting error like this Error: No developer directory found at /Developer”? then type

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

Linking static libraries in Xcode

Firstly, we pull in the .a files.

Create a new Empty Application using Xcode. Assign a Product Name and Company Identifier. Then click Next and save the project. Locate the universal libs that we created (the .a files) under ffmpeg/universal/lib. Drag the .a files into the Frameworks folder in the Project Navigator pane. Tick “Copy items into destination group’s folder (if needed)”. And click Finish.

Now we take care of the include files.

Locate the include files under ffmpeg/armv7/include. Drag and drop the content of that folder onto the Project Name folder in the Project Navigator pane. Again, tick “Copy items into destination group’s folder (if needed)”. Then click Finish.

Finally, we need to set the Header Search Paths for the project.

Click on the Project in the Project Navigator pane. In the Standard Editor in the middle of the screen, click on Build Settings. Search for “Header Search Paths”. Add your project path and set it to Recursive. i.e. $(SRCROOT) Click on Build Phases. Under Link Binary With Libraries, add libbz2.dylib and libz.dylib.

Test and verify the working of library

We are not going to be in-depth here. Just to verify that the library is functioning. Go to your AppDelegate.m, and add:

> #include "avformat.h"

And in the didFinishLaunchingWithOptions function, add:

av_register_all();

if suppose you are getting this errors means

Undefined symbols for architecture i386: "_iconv", referenced from: _mail_iconv in libmailcore.a(charconv.o) "_iconv_open", referenced from: _charconv in libmailcore.a(charconv.o) _charconv_buffer in libmailcore.a(charconv.o) "_iconv_close", referenced from: _charconv in libmailcore.a(charconv.o) _charconv_buffer in libmailcore.a(charconv.o) ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status

then add libiconv.dylib framework

you are now ready to dive in to develop using FFmpeg on iOS.

Share:
14,098

Related videos on Youtube

Chandramani
Author by

Chandramani

Updated on July 11, 2022

Comments

  • Chandramani
    Chandramani almost 2 years

    Can any One Tell me how do i integrate FFMPEG in my iphone/ ipad project.i m using Xcode 4. i searched a lot but did not find any useful Link .please tell me step by step procedure to integrate FFMpeg in my project.

    thanks,

  • Jona
    Jona over 10 years
    The key for me was adding libbz2.dylib, libz.dylib and libiconv.dylib. I have no clue why they are needed... An explanation would be great! Thanks!
  • Taiko
    Taiko over 10 years
    Beginner's mistake : I took a long time to find "Build Phases" and "Link Binary With Libraries" For those like me, it is a tab like "Build Settings", but appears only on a given "Target", not on the "Project".
  • Suran
    Suran over 9 years
    @PushpaRaja, Wow wow wow!!! How should I compliment you man!!! This is super awesome. A complete step by step guide. Thank you very very much. For people who don't want to compile FFMpeg by themselves, download the compiled libraries from downloads.sourceforge.net/project/ffmpeg-ios/… and continue from the step "Linking static libraries in Xcode" in this reply. Once again I really appreciate the effort put by Pushpa Raja. Thanks a lot.
  • Ajaxharg
    Ajaxharg over 7 years
    I'm on Xcode 8 and VideoToolbox.framework is required instead of libiconv.dylib.
  • deek0146
    deek0146 about 6 years
    How do you actually execute ffmpeg commands from objective C code using this statically linked library?