使用cocos2d-x + ffmpeg播放视频

本文介绍如何使用Cocos2d-x游戏引擎结合FFmpeg在iOS平台上实现视频播放功能,包括FFmpeg的编译、库的创建,以及在Cocos2d-x中创建视频播放层CCVideoLayer的详细步骤。虽然实用价值与投入不成正比,但该方法可实现通用的跨平台视频播放控件,避免系统控件的限制。
摘要由CSDN通过智能技术生成

1、未完成,待补充,完善后会上传完整代码(包含ffmpeg).目标平台暂定ios,完善后会完美跨平台。

2、实用价值跟遇到的困难不成正比,研究价值更大。

3、我们需要一个通用的,可嵌入到游戏内部的视频播放控件。 现有的解决方案都是android和iOS各自实用系统控件进行封装。好处是实现简单,一般情况下稳定,并且解码效率高。 缺点是无法与游戏真正契合在一起,毕竟是作为只能悬浮在游戏之上,并且iOS下面的MPPlayer还有一些恶心的问题,比如视频方向和大小莫名其妙的改变了。 

      另外,一个通用的播放控件可以完美的跨平台。比如现在的wp8版本暂时还无法播放视频,而且可以想见,如果使用的是native c++的系统结构,那么一定没有系统视频控件。

------------------------------------正文-----------------------------------

1、首先我们要做的是下载ffmpeg的代码 (git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg) ,在windows下编译ffmpeg是相当麻烦的一件事(原因是微软的vs死活不支持c99,而ffmpeg死活要用c99),这个最后再研究。iOS下面最简单,所以先研究iOS平台。 另外要注意,使用越新版本的ffmpeg,出问题的可能性越大。所以直接clone上面的地址不见得是一件正确的事情,直接下载一个稳定版本最好。

2、下载最新的gas-preprocessor并拷贝到/usr/bin目录下,这个是unix下用来预处理汇编文件的脚本,mac下没有,需要到libav的网站去下载(http://git.libav.org/?p=gas-preprocessor.git),如果版本与ffmpeg不一致的话,可能会在编译汇编文件的时候出现编译错误

unknown register alias 'TCOS_D0_HEAD'

      ps:小说明一下libav,这个是ffmpeg的一个fork分支,起因是领导者对如何维护ffmpeg项目的分歧。代码非常相似,并且ffmpeg会经常从libav merge代码。不过无所谓一个要优于另外一个,否则就不会依然存在两个项目了。

3、在命令行下面切换到ffmpeg代码目录,运行configure

编译armv7版本的静态库

[plain]  view plain copy
  1. ./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.1.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=5.1" --extra-ldflags="-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -miphoneos-version-min=4.3" --arch=arm --cpu=cortex-a9 --enable-pic  

待执行完毕后,运行 make; make install,如果权限不做就加上sudo。

注意几个参数,--prefix指定了make install的时候拷贝头文件和静态库的目标路径。  --sysroot指定了SDK版本,这个基本上一个xcode只有一个,要指定对,否则无法运行gcc。 --arch  --cpu 指定了当前cpu架构。  另外一些参数决定了要编译的内容。如果全部编译的话静态库有100+mb,很多编码器和解码器我们是用不到的,可以直接干掉。


同理,如果我们想要在模拟器下运行的话,还需要i386版本的静态库。

[plain]  view plain copy
  1. ./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.1.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.1.sdk" --arch=i386 --cpu=i386 --enable-pic --disable-asm  
4、当生成完毕两个版本的静态库后,我们需要使用lipo来合并两个版本,制作一个通用库。

[plain]  view plain copy
  1. lipo -output universal/lib/libavcodec.a  -create -arch armv7 armv7/lib/libavcodec.a -arch i386 i386/lib/libavcodec.a  
  2. lipo -output universal/lib/libavdevice.a  -create -arch armv7 armv7/lib/libavdevice.a -arch i386 i386/lib/libavdevice.a  
  3. lipo -output universal/lib/libavfilter.a  -create -arch armv7 armv7/lib/libavfilter.a -arch i386 i386/lib/libavfilter.a  
  4. lipo -output universal/lib/libavformat.a  -create -arch armv7 armv7/lib/libavformat.a -arch i386 i386/lib/libavformat.a  
  5. lipo -output universal/lib/libavresample.a  -create -arch armv7 armv7/lib/libavresample.a -arch i386 i386/lib/libavresample.a  
  6. lipo -output universal/lib/libavutil.a  -create -arch armv7 armv7/lib/libavutil.a -arch i386 i386/lib/libavutil.a  
  7. lipo -output universal/lib/libswresample.a  -create -arch armv7 armv7/lib/libswresample.a -arch i386 i386/lib/libswresample.a  
  8. lipo -output universal/lib/libswscale.a  -create -arch armv7 armv7/lib/libswscale.a -arch i386 i386/lib/libswscale.a  
如果熟悉shell脚本的话,可以把上面的这些操作写成一个shell脚本,这样就方便很多了。 这里直接贴出这些步骤,一个图方便,二是明了我们真正需要操作什么。

5、生成通用静态库后,就可以直接把这些库加入到xcode项目中,设置好头文件依赖。 这里需要注意的是,包含ffmpeg头文件时需要用extern "C" {} 来括起来,否则就是一大堆链接错误

6、写一个CCVideoLayer来用cocos2d-x播放视频

       头文件

[cpp]  view plain copy
  1. #pragma once  
  2. #include "cocos2d.h"  
  3.   
  4. #ifdef __APPLE__  
  5. #include <tr1/functional>  
  6. namespace std {  
  7.     namespace tr1 {}  
  8.     using namespace tr1;  
  9.     using tr1::function;  
  10. }  
  11. //using namespace std::tr1;  
  12. #else  
  13. #include <functional>  
  14. #endif  
  15.   
  16. struct AVFormatContext;  
  17. struct AVCodecContext;  
  18. struct AVFrame;  
  19. struct AVPicture;  
  20. struct SwsContext;  
  21.   
  22. NS_CC_BEGIN  
  23.   
  24. class CCVideoLayer : public CCSprite  
  25. {  
  26. public:  
  27.     static CCVideoLayer* create(const char* path, int width, int height);  
  28.     CCVideoLayer();  
  29.     virtual ~CCVideoLayer();  
  30.       
  31.     bool init(const char* path, int width, int height);  
  32.     void play(void);  
  33.     void stop(void);  
  34.     void pause(void);  
  35.     void seek(double sec);  
  36.     void draw(void);  
  37.     void update(float dt);  
  38.       
  39.     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);  
  40.     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  
  41.     virtual 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值