iOS 基于FFmpeg的移动端Demo:IOS 视频转码器

来源:互联网 发布:新开淘宝店没生意怎么办 编辑:程序博客网 时间:2024/05/17 22:05


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

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

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

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


本文记录IOS平台下基于FFmpeg的视频转码器。该转码器实际上移植自ffmpeg工程中的ffmpeg.c源代码。有关ffmpeg.c的源代码可以参考文章《ffmpeg.c函数结构简单分析(画图)》,在这里就不重复记录了。



源代码

项目的目录结构如图所示。


下列C语言文件拷贝自FFmpeg源代码:

cmdutils.c
cmdutils.h
cmdutils_common_opts.h
config.h
ffmpeg.h
ffmpeg_filter.c
ffmpeg_opt.c

此外在编译ffmpeg.c的时候,除了需要FFmpeg SDK中的头文件之外,还需要从源代码中拷贝下面头文件。

libavformat/ffm.h
libavformat/network.h
libavformat/os_support.h
libavformat/url.h
libavutil/libm.h

fmpeg_mod.c是修改后的ffmpeg.c文件。ffmpeg.c本身是用于命令行使用的程序,因此在改为类库调用的时候需要对源代码做一些修改。例如去掉一些exit(0),释放一些变量,main()函数改名为ffmpegmain()等。

Objective-C调用FFmpeg的代码位于ViewController.m文件中,内容如下所示。
[objc] view plaincopy
  1. #import "ViewController.h"  
  2. #include "ffmpeg.h"  
  3.   
  4. int ffmpegmain(int argc, charchar **argv);  
  5.   
  6. @interface ViewController ()  
  7.   
  8. @end  
  9.   
  10. @implementation ViewController  
  11.   
  12. - (void)viewDidLoad {  
  13.     [super viewDidLoad];  
  14.     // Do any additional setup after loading the view, typically from a nib.  
  15. }  
  16.   
  17. - (void)didReceiveMemoryWarning {  
  18.     [super didReceiveMemoryWarning];  
  19.     // Dispose of any resources that can be recreated.  
  20. }  
  21.   
  22. - (IBAction)clickRunButton:(id)sender {  
  23.     char command_str_full[1024]={0};  
  24.       
  25.   
  26.     NSString *command_str= [NSString stringWithFormat:@"%@",self.command.text];  
  27.     NSArray *argv_array=[command_str componentsSeparatedByString:(@" ")];  
  28.     int argc=argv_array.count;  
  29.     char** argv=(char**)malloc(sizeof(char*)*argc);  
  30.     for(int i=0;i<argc;i++)  
  31.     {  
  32.         argv[i]=(char*)malloc(sizeof(char)*1024);  
  33.         strcpy(argv[i],[[argv_array objectAtIndex:i] UTF8String]);  
  34.     }  
  35.       
  36.     ffmpegmain(argc, argv);  
  37.       
  38.     for(int i=0;i<argc;i++)  
  39.         free(argv[i]);  
  40.     free(argv);  
  41.   }  
  42. @end  

运行结果

App在手机上运行后的结果如下图所示。


单击“Run”按钮之后,程序会根据输入的命令进行转码。例如对于上述截图的情况,就会将/Users/leixiaohua1020/Desktop/test.mp4转码为/Users/leixiaohua1020/Desktop/test.mov。生成的视频文件如下图所示。

下载


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平台的最简单程序


0 0