学习ffmpeg.c过程中遇上的系列问题

本文详细解析了FFmpeg中与线程相关的API,包括avcodec_thread_init、avcodec_thread_free、avcodec_default_execute和avcodec_default_execute2的功能与用法,并解释了如何在命令行中使用这些API进行多线程转换操作,同时探讨了FFmpeg的线程安全性和信号量管理,以及为何在Windows和Linux环境下线程优先级设置不作为关键因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对ffmpeg的以下几个线程有关的api所涉及的机制不太懂:

int avcodec_thread_init(AVCodecContext *s, int thread_count);
void avcodec_thread_free(AVCodecContext *s);
int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret,

int count, int size);
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg,

int *ret, int count);

在ffmpeg.c里,只调用到了avcodec_thread_init()这个函数
如在
static void new_video_stream(AVFormatContext *oc)
函数3213行里:
avcodec_thread_init(st->codec, thread_count;
其他2个函数
avcodec_thread_free是在avcodec_thread_init里调用
avcodec_default_execute,avcodec_default_execute2是在avcodec_get_context_defaults2赋值
void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType codec_type){
... ...
    s->execute= avcodec_default_execute;
    s->execute2= avcodec_default_execute2;
... ...
};

我猜的是这样的:
ffmpeg转换时,支持多线程,那么api暴露出来的函数avcodec_thread_init,
设置线程数,那么内部则通过s->execute这个字段来做多线程的工作.

即当我使用以下命令时:
{ "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },

如:
ffmpeg -i a.flv -threads 5 a.avi
ffmpeg内部自动开了5条线程来进行转换?

不知道我理解得对不对?但同时,我有疑问的是,
是不是线程安全,信号量,ffmpeg已经做好了的.比如,即使,我要在UI界面里,操作控件,将转换进度等信息表现出来,
都可以直接使用的,而不用在UI界面里要考滤同步的问题?

同时,怎么没有设置线程优先级之类的函数.呵呵,我是在windows下编程的,可能这个问题有点没水平,不清楚linux的情形.
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值