在SRS的Ingest功能中,会调用本地FFmpeg进行拉流转码,

调用的核心代码在srs_app_ffmpeg.cpp SrsFFMPEG::start() 中:

    // memory leak in child process, it's ok.
char** charpv_params = new char*[params.size() + ];
for (int i = ; i < (int)params.size(); i++) {
std::string& p = params[i];
charpv_params[i] = (char*)p.data();
}
// EOF: NULL
charpv_params[params.size()] = NULL; // TODO: execv or execvp
ret = execv(ffmpeg.c_str(), charpv_params);
if (ret < ) {
fprintf(stderr, "fork ffmpeg failed, errno=%d(%s)",
errno, strerror(errno));
}
exit(ret);

SrsFFMPEG 这个类提供了一个用户设置额外参数的接口

void SrsFFMPEG::set_iparams(string iparams)
{
_iparams = iparams;
}

但是是一次性的,也就是只能设置一个参数,

如果你想设置多个,不能用空格的方法隔开,例如我自己就这么写的:

set_iparams("-rtsp_transport tcp");

结果死活都运行不成功,看log打印出来的参数是完全正确,而且我用同样的参数手动运行FFmpeg也是对的。

折腾了半天,最后还是通过仔细看代码发现问题所在:

重点在叫起 FFmpeg的函数:execv()

int execv(const char *path, char *const argv[]);

其参数是用字符串数组的方式存储,而SRS的代码里是直接将你填进去的参数当一个参数写进去,不看你的空格!

也就是说我的 "-rtsp_transport tcp" 在argv里面是这样的

{"...", "...", "-rtsp_transport tcp", "..."}

是个无效参数,所以只能将其分开写入到存储参数的params变量中。

注意 SrsFFMPEG 并没有提供这样的接口,需要自己修改代码。

SRS源码——调用FFmpeg参数问题的更多相关文章

  1. 源码调用ffmpeg库时,需要注意接口为C接口

    即引用相关头文件时候,要使用extern "C"{}来包含. 关于extern "C"{}的详情,参考:http://www.cnblogs.com/skyne ...

  2. SRS源码—— Thread笔记

    SRS源码中的Thread是一层套一层,最终的Thread类是在 srs_app_thread.cpp 的 SrsThread 类 这里我们暂且先放下协程的概念,把它当线程来看,其逻辑如下: 1. 在 ...

  3. Linux 源码安装 FFmpeg

    加班次数频繁,已经快一年没有写博了.由于此次在项目中使用到了 FFmpeg 来处理音视频,顾记录下在 Linux 系统中源码安装 FFmpeg 以便不时之需. 1. 安装 yasm yasm 是一个汇 ...

  4. [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice

    [源码解析] 机器学习参数服务器ps-lite 之(1) ----- PostOffice 目录 [源码解析] 机器学习参数服务器ps-lite 之(1) ----- PostOffice 0x00 ...

  5. [源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van

    [源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van 目录 [源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van 0x00 摘要 0x01 功能 ...

  6. [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer

    [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer 目录 [源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer 0x0 ...

  7. [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现

    [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 目录 [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 0x00 摘要 0x01 基础类 1. ...

  8. [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构

    [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 目录 [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 0x00 摘要 0x01使用 1.1 配置 ...

  9. [源码解析] 机器学习参数服务器Paracel (3)------数据处理

    [源码解析] 机器学习参数服务器Paracel (3)------数据处理 目录 [源码解析] 机器学习参数服务器Paracel (3)------数据处理 0x00 摘要 0x01 切分需要 1.1 ...

随机推荐

  1. 总结fiddler抓https包

    把fiddler工具>选项>https>勾选所有,点击actions,导出的证书导入到浏览器(打开右上角浏览器设置>选项>高级>证书>查看证书>证书机构 ...

  2. iOS 优化ipa包,减小安装包大小

    https://www.jianshu.com/p/a49d59b01669 项目打包之后.ipa包的大小是118.9M,上传到App Store后iPhone6s上显示85.5M,下载时间太长,所以 ...

  3. ZooKeeper-集群模式配置

    (1)下载安装zookeeper,进行基本的配置,详细教程:https://www.cnblogs.com/excellencesy/p/11956485.html (2)在三台虚拟机上分别按照以上方 ...

  4. 【转】docker配置参数详解---/etc/docker/daemon.json完整参数

    docker-daemon.json各配置详解 { “api-cors-header”:"", ——————在引擎API中设置CORS标头 “authorization-plugi ...

  5. UA池 代理IP池 scrapy的下载中间件

    # 一些概念 - 在scrapy中如何给所有的请求对象尽可能多的设置不一样的请求载体身份标识 - UA池,process_request(request) - 在scrapy中如何给发生异常的请求设置 ...

  6. 我来给你讲清楚Pythony广播

    初学python广播搞的人头大,今天老师上课讲了一下,茅塞顿开,zt老师nb 首先说一下后向纬度(这个后向纬度书里边称作低维),举例:(3,4,5)后向纬度是:3*4*5或4*5或5 向量广播的条件有 ...

  7. webservice笔记

    Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...

  8. CentOS7中JDK的安装和配置

    1.使用yum线上安装jdk 这里以jdk1.7为例进行示范,1.8同理 yum -y list java*                  #浏览线上所有jdk版本列表,列表太长了,会显示不全 y ...

  9. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  10. C:数值溢出问题

    当超过一个数据类型能够存放最大的范围时,数值会溢出. 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失. #include <stdio.h> i ...