最簡單的基於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
 * [email protected]
 * 馬小雨 Ma Xiaoyu
 * [email protected]
 * 中國傳媒大學/數字電視技術
 * 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

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平臺的最簡單程序


發佈了372 篇原創文章 · 獲贊 2104 · 訪問量 1306萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章