如何设置解复用器参数

简介: 解复用器 (demuxer)的参数 分为 通用部分 跟 私有部分。通用部分是指所有文件格式都有的属性,例如 formatprobesize 是 MP4 跟 FLV都有的属性。而 export_all 是只有 MP4 自己才有的属性。

解复用器 (demuxer)的参数 分为 通用部分私有部分。通用部分是指所有文件格式都有的属性,例如 formatprobesize 是 MP4 跟 FLV都有的属性。而 export_all 是只有 MP4 自己才有的属性。


通用部分的参数可以通过以下命令来查看:

ffmpeg.exe -h > t.txt

私有部分的参数可以通过指定 解复用器来查看:

ffmpeg.exe -hide_banner 1 -h demuxer=mp4


无论是通用还是私有属性,都是使用 AVDictionary 来设置 demuxer 的属性的,就是最后一个参数 AVDictionary **options,如下:

int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);

读者可能会疑惑,设置复用器的属性,直接设置他的字段不就行了,为什么要搞一个 AVDictionary 出来。因为 FFmpeg 社区有大量的命令行用户,他们习惯通过 字符串传参 来 设置 复用器,解码器等等的属性。有些用户是不会写 C/C++ 代码的。

AVDictionary 这个结构就是为了 命令行的字符串传参 这个需求而设计出来的,它的定义如下:

struct AVDictionary {
    int count;
    AVDictionaryEntry *elems;
};
typedef struct AVDictionaryEntry {
    char *key;
    char *value;
} AVDictionaryEntry;

可以看到,非常简单,AVDictionary 就是一个列表,里面存储着多个 AVDictionaryEntry,而 AVDictionaryEntry 是一个 key value 的结构体。


下面就来演示一下如何用 AVDictionary 来设置 MP4 解复用器的属性。本文的代码可再 GitHub 上下载。

代码运行结果如下:

可以看到,当 AVDictionary 里面的值被使用了,就会剔除掉。剩下的 option 就是用不上的,什么情况会用不上?就是写错了名称。例如,上面代码中的 export_666 就是故意写错的。


上面的代码有两个重点:

第一,我没有在代码里申请 AVDictionary 的内存,那他的内存是从哪里来的?

答:是从 av_dict_set() 函数内部申请的内存,如果你传 NULL 给它,av_dict_set() 内部就会申请一块内存,可以看到函数的第一个参数是一个二级指针

在用完 AVDictionary 之后,需要调 av_dict_free() 手动释放堆内存


第二,如何申请一个栈内存的 AVDictionary ,也就是局部变量。

答:无法做到,AVDictionary 只能以指针指向堆内存的方式来使用,如果你想创建一个 局部变量 AVDictionary opts 放在栈内存里面,编译器会报 incomplete type 未实现类型错误。如下:

这是因为 AVDictionary 这个类型的定义 放在 dict.c 文件里面了,而 这个 .c 文件已经被编译器编译进去 dll,编译器看不到这个结构体的实现了。


上面讲的是 demuxer (解复用器)的参数设置。muxer (复用器)的参数也是这样设置的。不过 复用器 是通过 avio_open2() 函数来设置,如下:

int avio_open2(AVIOContext **s, const char *filename, int flags,
               const AVIOInterruptCB *int_cb, AVDictionary **options)

最后一个参数就是 AVDictionary **options。可以通过以下命令 查询 复用器支持的参数。

ffmpeg.exe -hide_banner 1 -h muxer=mp4

我下面的截图是用 clionwatch point 功能 追踪命令行参数 -movflags empty_moovffmpeg.c 里面怎么传进去的。

ffmpeg.exe -i juren-5s.mp4 -movflags empty_moov ttt.mp4

可以看到,就是从 avio_open2() 函数里传进去的。


目录
相关文章
|
6月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
68 0
QT自定义信号,信号emit,信号参数注册
|
6月前
010.第一个回声服务器可能遇到的问题——connect函数
由connect函数使用不当导致的小错误 博客说明: 在008.一个简单的网络服务器开发----回声服务器篇博客中我们实现了一个最为简单的回声服务器,当时我们为了突出程序的逻辑性,从而没有对部分函数进行错误检查那么博主在这里指出一个大家可能会遇到的一个经典错误,而且这个错误还不是太好排查的,那就是忽略了connect函数的返回值从而导致客户端发了消息但是服务器端并没有回应。
62 0
|
存储 运维 网络协议
如何实现 呼叫速率(caps) 值控制
首先,企业需要明确的是呼叫中心系统搭建的目的。搭建这个呼叫中心是想用来做什么呢? 是为了企业当做呼入型的客服使用? 还是用来当电话外呼使用? 是企业想做营销用呢还是政府单位办公使用? 是要做外包服务呢还是自己用? 是想挣钱用呢还是想做客户服务使用? 需求 呼叫中心的搭建肯定有需求,这就要把一份需求文档写出来。比如想要做什么,每一点写的清清楚楚: 需求包括现在有什么? 碰到了什么问题? 以后想整成什么样? 设置,扩容以及升级的快速,成本与灵活性 一个企业的业务、流程与规模有时候随着市场的快速成长会有很大的变化。这时候,企业的呼叫中心系统就要能够快速的适应市场,能让企业做出适当的调整。比如,呼叫中
|
6月前
|
安全
SCXI-1193 控制器 多路复用器开关模块 NI 仪器仪表 SCXI-1001
`SCXI-1193`是款500 MHz的四路8x1多路复用器,支持多种配置。关键特性包括:射频功率处理(10瓦至500 MHz),初始DC路径电阻低,寿命终时约为1.0ω。最大RF功耗限制为7 W,扫描速率为100通道/秒。继电器寿命达5000万次机械循环和30万次电气循环。物理特性包括机电继电器,36个MCX连接器和2个SMB触发器插孔。尺寸为3.0 × 17.3 × 19.8厘米,工作温度范围从0°C到50°C。产品遵循EN 61010-1等安全标准和EN 61326-1的EMC规定。
|
6月前
|
Go 开发者
通道技巧,关闭通道后还能继续用
通道技巧,关闭通道后还能继续用
103 0
|
缓存 网络协议 算法
窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理
当涉及网络性能优化和数据传输可靠性时,TCP/IP滑动窗口是一个关键的技术。本文的摘要将深入揭示TCP/IP滑动窗口的工作原理,探讨其在确保数据准确性和实现高效通信方面的重要性。通过对滑动窗口大小、流控制和数据包确认机制的解析,我们将揭示如何通过优化窗口大小和流控制参数来提升网络性能。此外,我们还将介绍滑动窗口在解决网络拥塞和丢包问题方面的作用,以及如何通过精准的窗口调整实现零丢失、百分之百到达的数据传输。通过理解滑动窗口的工作原理,读者将能够更好地理解网络通信的内部机制,并为优化其应用程序的性能提供有价值的见解。
376 0
窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理
|
缓存 网络协议
TCP的窗口控制和重发控制【TCP原理(笔记三)】
TCP的窗口控制和重发控制【TCP原理(笔记三)】
128 1
|
Linux
设置socket接收和发送超时的一种方式
设置socket接收和发送超时的一种方式
699 0
窗口置前的几种方法
函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
|
监控
预置位定义及功能
  1、预置位功能解释:     当用户通过控制设备操作终端的监控云台监视目标时,操作人员可以把当前监视目标设置一个预置位,比如一个动点云台,可以365或360度全方位旋转监视;操作人员可以把一个窗口、柜台、办公桌、出入口、存车处等需要监视的地点设置为预置位;设置好的预置位可以通过控制设备软件操作把当前位置保存在终端监控云台的解码器上。
2146 0