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

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

最简单的基于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文件里,内容例如以下所看到的。
/*** 最简单的基于FFmpeg的转码器-IOS* Simplest FFmpeg IOS Transcoder** 雷霄骅 Lei Xiaohua* leixiaohua1020@126.com* 马小雨 Ma Xiaoyu* maxiaoyucuc@163.com* 中国传媒大学/数字电视技术* Communication University of China / Digital TV Technology* http://blog.csdn.net/leixiaohua1020** 本程序是IOS平台下的转码器。

它移植于ffmpeg.c命令行工具。 * * This software is a Transcoder in IOS. It is transplanted from ffmpeg.c * command line tools. */ #import "ViewController.h" #include "ffmpeg.h" int ffmpegmain(int argc, char **argv); @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)clickRunButton:(id)sender { char command_str_full[1024]={0}; NSString *command_str= [NSString stringWithFormat:@"%@",self.command.text]; NSArray *argv_array=[command_str componentsSeparatedByString:(@" ")]; int argc=argv_array.count; char** argv=(char**)malloc(sizeof(char*)*argc); for(int i=0;i<argc;i++) { argv[i]=(char*)malloc(sizeof(char)*1024); strcpy(argv[i],[[argv_array objectAtIndex:i] UTF8String]); } ffmpegmain(argc, argv); for(int i=0;i<argc;i++) free(argv[i]); free(argv); } @end


执行结果

App在手机上执行后的结果例如以下图所看到的。


单击“Run”button之后,程序会依据输入的命令进行转码。

比如对于上述截图的情况。就会将/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平台的最简单程序


转载于:https://www.cnblogs.com/blfbuaa/p/7204950.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP_CodeIgniter _remap重新定义方法

如果controller定义了_remap方法&#xff0c; 在_remap中重新定义方法 class Test extends CI_Controller{public function index(){echo "hello world";}//index.php/Test/success/id/1aapublic function _remap($method,$params){if($methodsuccess){$method . 2; …

php20个字,北京人会说不会写的20个字,第一个我就跪了

这20个字你们都会写吗?扽■ 【读音】dn■ 【释义】拉&#xff0c;猛拉&#xff0c;使伸直或平整。■ 【举例】快来人啊&#xff0c;我扽不住他啦!熥■ 【读音】tēng■ 【释义】把已经熟了的食物再加热。■ 【举例】馒头凉了&#xff0c;熥熥再吃。皴■ 【读音】cūn■ 【释义…

【洛谷2986】【USACO10MAR】伟大的奶牛聚集

题面 题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Each cow lives in one of N (1 < N < 100,000) differ…

工作73:获取id值

this.$route.params,id取值

hdu 5785 Interesting(manacher+前缀和)

题目链接&#xff1a;hdu 5785 Interesting 题意&#xff1a; 有一个长度为n的串&#xff08;n<10^6&#xff09;&#xff0c;对 1 < i < j < k < length(s) . 如果[i&#xff0c;j]和[j1,k]都是回文串。则对答案的贡献为 i*k ,求贡献和。 题解&#xff1a; 详细…

工作74:vue带参数跳转其他页面

1.准备好两个vue文件 panda.vue travel.vue 2.写index.js配置文件 import travel from /components/travel1{path: /travel/:id,name: 测试页面,component: travel}3.编写跳转前的页面 这是一个点击事件 gettravel(id) {this.$router.push({path: /travel/ id,})}},1234567 …

洛谷 3381 【模板】最小费用最大流

https://www.luogu.org/problem/show?pid3381 题目描述 如题&#xff0c;给出一个网络图&#xff0c;以及其源点和汇点&#xff0c;每条边已知其最大流量和单位流量费用&#xff0c;求出其网络最大流和在最大流情况下的最小费用。 输入输出格式 输入格式&#xff1a; 第一行包…

自己定义ViewGroup控件(一)-----gt;流式布局进阶(一)

main.xml <?xml version"1.0" encoding"utf-8"?> <com.example.SimpleLayout.MyLinLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http://schemas.android.com/tools" android:layout_wi…

【C++11/17】std::map高效插入

我们在使用stl的映射容器std::map时&#xff0c;经常需要向容器中插入数据。由于map的元素key值是唯一的&#xff0c;我们经常遇到这样的场景&#xff1a; 向map中插入元素时&#xff0c;指定的key已经存在则直接更新&#xff1b;指定的key不存在&#xff0c;然后才做插入操作…