IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    leixiaohua1020发表于 2015-08-01 16:34:20
    love 0
    本文记录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”按钮之后,程序会根据输入的命令进行转码。例如对于上述截图的情况,就会将/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


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




沪ICP备19023445号-2号
友情链接