一:下载编译脚本
地址:https://github.com/kewlbear/FFmpeg-iOS-build-script
二:下载并安装gas-preprocessor
地址:https://github.com/FFmpeg/gas-preprocessor
将文件 gas-preprocessor.pl 复制到 /usr/local/bin
三:编译文件
1:打开编译脚本 build-ffmpeg.sh
2:修改版本号(以4.4.1为例)

可以选择自己需要的版本进行编译。
版本信息及更新日志:https://ffmpeg.org/download.html
3:修改配置

可以精简掉一些没有用到的功能,减少文件体积。
配置选项参考:https://blog.csdn.net/momo0853/article/details/78043903
4:安装Yams
运行编译脚本时,会自动安装Yams,如果安装失败,可以手动下载安装
地址:http://yasm.tortall.net/Download.html
5:运行编译脚本

./build-ffmpeg.sh arm64 x86_64
参数为需要支持的平台,默认为arm64 armv7 x86_64 i386
等待编译完成。
四:异常处理
1:xcrun -sdk iphoneos clang is unable to create an executable file.C compiler test failed.
解决方案:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
2:编译错误 unknown type name 'AudioDeviceID'; did you mean 'AudioFileID'?
解决方案:
添加配置参数 --disable-audiotoolbox
参考来源:https://github.com/kewlbear/FFmpeg-iOS-build-script/issues/161
五:集成
1:在Link Binary With Libraries中添加以下文件
libbz2.tbd
libiconv.tbd
libz.tbd
AVFoundation.framework
2:将编译好的FFmpeg-iOS文件夹拖入项目中

3:添加头文件路径
Build Setting -> Search Paths -> Header Search Paths 添加 $(SRCROOT)/$(PRODUCT_NAME)/FFmpeg-iOS/include
4:将 ffmpeg-4.4.1 -> fftools 文件夹中以下文件拖入项目中,在配置文件中禁用功能对应的文件除外
cmdutils.c
cmdutils.h
ffmpeg_filter.c
ffmpeg_hw.c
ffmpeg_opt.c
ffmpeg_videotoolbox.c
ffmpeg.c
ffmpeg.h
ffplay.c
ffprobe.c
5:将 scratch 文件夹下任意一个架构文件夹中的 config.h 文件拖入项目中对应位置
6:将 ffmpeg-4.4.1 -> libavutil -> thread.h 文件拖入项目中对应位置
7:运行程序,注释掉缺失文件引用
#include "libavresample/avresample.h"
#include "compat/va_copy.h"
#include "libavutil/internal.h"
#include "libpostproc/postprocess.h"
#include "libavutil/libm.h"
#include "libavcodec/mathops.h"
#include "libavformat/os_support.h"
8:注释掉报错的代码
nb0_frames = nb_frames = mid_pred(ost->last_nb0_frames[0],
ost->last_nb0_frames[1],
ost->last_nb0_frames[2]);
ff_dlog(NULL, "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n",
ost->forced_keyframes_expr_const_values[FKF_N],
ost->forced_keyframes_expr_const_values[FKF_N_FORCED],
ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N],
ost->forced_keyframes_expr_const_values[FKF_T],
ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T],
res);
PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
9:修改main函数
将 ffmpeg.c 中 int main(int argc, char **argv) 修改为
int ffmpeg_main(int argc, char **argv)
在 ffmpeg.h 中声明
int ffmpeg_main(int argc, char **argv);
六:优化代码
1:重置计数器
在 ffmpeg.c 中找到 static void ffmpeg_cleanup(int ret) 方法,在 term_exit() 前添加
static void ffmpeg_cleanup(int ret)
{
/* ... */
progress_avio = NULL;
subtitle_out = NULL;
input_files = NULL;
input_streams = NULL;
output_files = NULL;
output_streams = NULL;
filtergraphs = NULL;
nb_input_files = 0;
nb_input_streams = 0;
nb_output_files = 0;
nb_output_streams = 0;
nb_filtergraphs = 0;
received_sigterm = 0;
received_nb_signals = 0;
term_exit();
ffmpeg_exited = 1;
}
2:防止执行结束退出程序
方法1:在 ffmpeg.c 中找到 int ffmpeg_main(int argc, char **argv) 方法,将其中所有的 exit_program() 替换为 ffmpeg_cleanup()
方法2:在 cmdutils.c 中找到 void exit_program(int ret) ,修改为
int exit_program(int ret)
{
if (program_exit)
program_exit(ret);
return ret;
}
在 cmdutils.h 找到对应的声明,修改为
int exit_program(int ret);
七:调用FFmpeg tool命令
以将m3u8转为mp4为例
- (void)action
{
NSString *output = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
stringByAppendingPathComponent:@"output.mp4"];
NSString *cmd = [NSString stringWithFormat:@"ffmpeg -i %@ -c:v copy -c:a copy %@",
self.url,output];
[[[NSThread alloc] initWithTarget:self selector:@selector(run:) object:cmd] start];
}
- (void)run:(NSString *)cmd
{
NSArray *argvs = [cmd componentsSeparatedByString:@" "];
int argc = (int)argvs.count;
char **argv = calloc(argc, sizeof(char *));
for (int i = 0; i < argc; i++)
{
argv[i] = (char *)[argvs[i] UTF8String];
}
ffmpeg_main(argc, argv);
}
FFmpeg tool命令格式为
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
常用参数
-i 输入源
-r 帧率
-c:a 音频编码格式
-c:v 视频编码格式
-b:a 音频比特率
-b:v 视频比特率
详细命令可见官方文档
地址:https://ffmpeg.org/ffmpeg.html
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+