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

news/2024/7/10 22:05:36 标签: ffmpeg, 移动开发, git

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

最简单的基于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的视频转码器。该转码器实际上移植自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 plain  copy
 
  1. /** 
  2.  * 最简单的基于FFmpeg的转码器-IOS 
  3.  * Simplest FFmpeg IOS Transcoder 
  4.  * 
  5.  * 雷霄骅 Lei Xiaohua 
  6.  * leixiaohua1020@126.com 
  7.  * 马小雨 Ma Xiaoyu 
  8.  * maxiaoyucuc@163.com 
  9.  * 中国传媒大学/数字电视技术 
  10.  * Communication University of China / Digital TV Technology 
  11.  * http://blog.csdn.net/leixiaohua1020 
  12.  * 
  13.  * 本程序是IOS平台下的转码器。它移植于ffmpeg.c命令行工具。 
  14.  * 
  15.  * This software is a Transcoder in IOS. It is transplanted from ffmpeg.c 
  16.  * command line tools. 
  17.  */  
  18.   
  19. #import "ViewController.h"  
  20. #include "ffmpeg.h"  
  21.   
  22. int ffmpegmain(int argc, charchar **argv);  
  23.   
  24. @interface ViewController ()  
  25.   
  26. @end  
  27.   
  28. @implementation ViewController  
  29.   
  30. - (void)viewDidLoad {  
  31.     [super viewDidLoad];  
  32.     // Do any additional setup after loading the view, typically from a nib.  
  33. }  
  34.   
  35. - (void)didReceiveMemoryWarning {  
  36.     [super didReceiveMemoryWarning];  
  37.     // Dispose of any resources that can be recreated.  
  38. }  
  39.   
  40. - (IBAction)clickRunButton:(id)sender {  
  41.     char command_str_full[1024]={0};  
  42.       
  43.   
  44.     NSString *command_str= [NSString stringWithFormat:@"%@",self.command.text];  
  45.     NSArray *argv_array=[command_str componentsSeparatedByString:(@" ")];  
  46.     int argc=argv_array.count;  
  47.     char** argv=(char**)malloc(sizeof(char*)*argc);  
  48.     for(int i=0;i<argc;i++)  
  49.     {  
  50.         argv[i]=(char*)malloc(sizeof(char)*1024);  
  51.         strcpy(argv[i],[[argv_array objectAtIndex:i] UTF8String]);  
  52.     }  
  53.       
  54.     ffmpegmain(argc, argv);  
  55.       
  56.     for(int i=0;i<argc;i++)  
  57.         free(argv[i]);  
  58.     free(argv);  
  59.   }  
  60. @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平台的最简单程序

 转至:http://blog.csdn.net/leixiaohua1020/article/details/47072673

转载于:https://www.cnblogs.com/haohao-developer/p/5417254.html


http://www.niftyadmin.cn/n/1347647.html

相关文章

引用、闭包、装饰器

引用 # 引用 def demo1():print(这是demo1里面的。。。)# 引用函数 demo2 demo1 # 代表函数内部代码的引用&#xff0c;demo2此时也指向demo1里面的内部代码 def test():print(这是在test里面的。。。) demo1 test # 重新指向的操作# 调用函数 demo1() # 这是在test里面的。…

zcmu 1018

1018: 突击战 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 602 Solved: 201[Submit][Status][Web Board]Description 你有n个部下&#xff0c;每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务&#xff0c;然后他会立刻独立地、无间断地执行Ji分钟后完成任务…

面向对象,类变量、类方法、(成员)实例变量(属性)、(成员)实例方法(属性)

1、成员方法调用成员变量&#xff1a; 成员方法调用成员变量&#xff1a; 类模板里面的 init 方法当中定义的公有变量 在创建对象出来之后定义的独有变量 公有变量&#xff1a;可以访问&#xff0c;通过 self.变量名调用 独有变量&#xff1a;谨慎操作class Man:# 成员变量的…

ZCMU 1143: 又是比智力

1143: 又是比智力 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1114 Solved: 202[Submit][Status][Web Board]Description 松哥上了数学课之后&#xff0c;觉得自己智力实在有所不足&#xff0c;所以他决定找人辩论&#xff0c;以提高自己的智力&#xff0c;已知松哥目前…

文件的读写基本操作

一、文件是计算机中数据持久化存储的表现形式 读写文件标准操作格式1&#xff1a; 1、打开文件&#xff1a;file1 open(文件名,读写模式) 2、操作文件 3、关闭文件&#xff1a;file1.close()文件操作完毕后必须关闭&#xff0c;否则长期保持对文件的连接状态&#xff0c;造成…

CSU-1507 超大型LED显示屏

1507: 超大型LED显示屏 Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 625 Solved: 331 Description Input 输入包含不超过100组数据。每组数据第一行为"START hh:mm:ss"&#xff0c;表示比赛开始时刻为hh:mm:ss。最后一行为"END hh:mm:…

可迭代对象、迭代器、生成器

可迭代对象 >> 迭代器 >> 特殊的迭代器&#xff08;生成器&#xff09; >> yield、可以达到完全多任务的效果 >> greenlet模块 >> yield 切换任务 达到多任务的效果 目的 >> gevent 进行再一步的封装 >> 切换任务 达到多任务的效果 …

2016年工作中遇到的问题11-20

11.SpringMVC的PathVariable。PathVariable("id") Integer id;RequestParam Integer id;使用了“路径变量”&#xff0c;同时要求它不为空&#xff0c;就使用了RequestParam PathVariable("id") Integer id;访问 /1001 &#xff0c;结果提示id总是找不到。…