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

2023-04-23,,

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

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

最简单的基于FFmpeg的移动端样例:IOS 视频转码器的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。