MLT媒体程序框架02:源码剖析

news/2024/5/5 0:54:37/文章来源:https://blog.csdn.net/upset_poor/article/details/137595422

以MLT自带的Melt命令行工具源码为例
去掉一些不重要的代码

melt.c

int main(int argc, char **argv)
{int i;mlt_consumer consumer = NULL;FILE *store = NULL;char *name = NULL;mlt_profile profile = NULL;int is_progress = 0;int is_silent = 0;int is_abort = 0;int is_getc = 0;int error = 0;mlt_profile backup_profile;mlt_repository repo = NULL;const char *repo_path = NULL;int is_consumer_explicit = 0;int is_setlocale = 0;// Handle abnormal exit situations.signal(SIGSEGV, abnormal_exit_handler);signal(SIGILL, abnormal_exit_handler);signal(SIGABRT, abnormal_exit_handler);// 设置地区,不设置默认是中国// 在程序中,区域是影响程序语言处理方式的环境变量,比如日期,时间,货币,数字和字符串的格式等。for (i = 1; i < argc; i++) {if (!strcmp(argv[i], "-setlocale")) {is_setlocale = 1;break;}}for (i = 1; i < argc; i++) {// Check for serialisation switchif (!strcmp(argv[i], "-serialise")) {name = argv[++i];if (name != NULL && strstr(name, ".melt"))store = fopen(name, "w");else {if (name == NULL || name[0] == '-')store = stdout;name = NULL;}}// Look for the profile optionelse if (!strcmp(argv[i], "-profile")) {// Construct the factoryif (!repo)repo = setup_factory(repo_path, is_setlocale);const char *pname = argv[++i];if (pname && pname[0] != '-')profile = mlt_profile_init(pname);} else if (!strcmp(argv[i], "-progress")) {is_progress = 1;} else if (!strcmp(argv[i], "-progress2")) {is_progress = 2;}// 查找,会打印对应的service种类和信息// Look for the query optionelse if (!strcmp(argv[i], "-query")) {// Construct the factoryif (!repo)repo = setup_factory(repo_path, is_setlocale);const char *pname = argv[++i];if (pname && pname[0] != '-') {if (!strcmp(pname, "consumers") || !strcmp(pname, "consumer"))query_services(repo, mlt_service_consumer_type);else if (!strcmp(pname, "filters") || !strcmp(pname, "filter"))query_services(repo, mlt_service_filter_type);else if (!strcmp(pname, "links") || !strcmp(pname, "link"))query_services(repo, mlt_service_link_type);else if (!strcmp(pname, "producers") || !strcmp(pname, "producer"))query_services(repo, mlt_service_producer_type);else if (!strcmp(pname, "transitions") || !strcmp(pname, "transition"))query_services(repo, mlt_service_transition_type);else if (!strcmp(pname, "profiles") || !strcmp(pname, "profile"))query_profiles();else if (!strcmp(pname, "presets") || !strcmp(pname, "preset"))query_presets();else if (!strncmp(pname, "format", 6))query_formats();else if (!strncmp(pname, "acodec", 6) || !strcmp(pname, "audio_codecs"))query_acodecs();else if (!strncmp(pname, "vcodec", 6) || !strcmp(pname, "video_codecs"))query_vcodecs();else if (!strncmp(pname, "consumer=", 9))query_metadata(repo,mlt_service_consumer_type,"consumer",strchr(pname, '=') + 1);else if (!strncmp(pname, "filter=", 7))query_metadata(repo, mlt_service_filter_type, "filter", strchr(pname, '=') + 1);else if (!strncmp(pname, "link=", 5))query_metadata(repo, mlt_service_link_type, "link", strchr(pname, '=') + 1);else if (!strncmp(pname, "producer=", 9))query_metadata(repo,mlt_service_producer_type,"producer",strchr(pname, '=') + 1);else if (!strncmp(pname, "transition=", 11))query_metadata(repo,mlt_service_transition_type,"transition",strchr(pname, '=') + 1);else if (!strncmp(pname, "profile=", 8))query_profile(strchr(pname, '=') + 1);else if (!strncmp(pname, "preset=", 7))query_preset(strchr(pname, '=') + 1);elsegoto query_all;} else {query_all:query_services(repo, mlt_service_consumer_type);query_services(repo, mlt_service_filter_type);query_services(repo, mlt_service_link_type);query_services(repo, mlt_service_producer_type);query_services(repo, mlt_service_transition_type);fprintf(stdout,"# You can query the metadata for a specific service using:\n""# -query <type>=<identifier>\n""# where <type> is one of: consumer, filter, producer, or transition.\n");}goto exit_factory;} else if (!strcmp(argv[i], "-silent")) {is_silent = 1;} else if (!strcmp(argv[i], "-quiet")) {is_silent = 1;mlt_log_set_level(MLT_LOG_QUIET);} else if (!strcmp(argv[i], "-verbose")) {mlt_log_set_level(MLT_LOG_VERBOSE);} else if (!strcmp(argv[i], "-timings")) {mlt_log_set_level(MLT_LOG_TIMINGS);} else if (!strcmp(argv[i], "-version") || !strcmp(argv[i], "--version")) {fprintf(stdout,"%s " VERSION "\n""Copyright (C) 2002-2023 Meltytech, LLC\n""<https://www.mltframework.org/>\n""This is free software; see the source for copying conditions.  There is NO\n""warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",basename(argv[0]));goto exit_factory;} else if (!strcmp(argv[i], "-debug")) {mlt_log_set_level(MLT_LOG_DEBUG);} else if (!strcmp(argv[i], "-abort")) {is_abort = 1;} else if (!strcmp(argv[i], "-getc")) {is_getc = 1;} else if (!repo && !strcmp(argv[i], "-repository")) {if (i + 1 < argc && argv[i + 1][0] != '-')repo_path = argv[++i];} else if (!strcmp(argv[i], "-consumer")) {is_consumer_explicit = 1;}}if (!is_silent && !isatty(STDIN_FILENO) && !is_progress)is_progress = 1;// Construct the factoryif (!repo)repo = setup_factory(repo_path, is_setlocale);// Create profile if not set explicitlyif (getenv("MLT_PROFILE"))// 根据环境变量去找到对应的profileprofile = mlt_profile_init(NULL);if (profile == NULL)profile = mlt_profile_init(NULL);elseprofile->is_explicit = 1;// 备份profile,然后加载consumer,如果profile在加载consumer的时候发生了改变,则表明这时候的profile信息是精确的// Look for the consumer option to load profile settings from consumer propertiesbackup_profile = mlt_profile_clone(profile);if (load_consumer(&consumer, profile, argc, argv) != EXIT_SUCCESS)goto exit_factory;// If the consumer changed the profile, then it is explicit.if (backup_profile && !profile->is_explicit&& (profile->width != backup_profile->width || profile->height != backup_profile->height|| profile->sample_aspect_num != backup_profile->sample_aspect_num|| profile->sample_aspect_den != backup_profile->sample_aspect_den|| profile->frame_rate_den != backup_profile->frame_rate_den|| profile->frame_rate_num != backup_profile->frame_rate_num|| profile->colorspace != backup_profile->colorspace))profile->is_explicit = 1;mlt_profile_close(backup_profile);backup_profile = NULL;// 除了第一个参数,把后面的参数都传递到factory中,用于生产producer// Get melt producerif (argc > 1)melt = mlt_factory_producer(profile, "melt", &argv[1]);if (melt) {// Generate an automatic profile if needed.if (!profile->is_explicit) {mlt_producer first_producer = mlt_properties_get_data(MLT_PRODUCER_PROPERTIES(melt),"first_producer",NULL);mlt_profile_from_producer(profile, first_producer);mlt_consumer melt_consumer = MLT_CONSUMER(mlt_service_consumer(MLT_PRODUCER_SERVICE(melt)));if (melt_consumer)mlt_consumer_connect(melt_consumer, NULL);mlt_producer_close(melt);melt = mlt_factory_producer(profile, "melt", &argv[1]);}double scale = mlt_properties_get_double(MLT_CONSUMER_PROPERTIES(consumer), "scale");if (scale > 0.0) {// 设置缩放set_preview_scale(&profile, &backup_profile, scale);}// Reload the consumer with the fully qualified profile.// The producer or auto-profile could have changed the profile.load_consumer(&consumer, profile, argc, argv);// See if producer has consumer already attachedif (!store && !consumer) {consumer = MLT_CONSUMER(mlt_service_consumer(MLT_PRODUCER_SERVICE(melt)));if (consumer) {// 增加引用计数mlt_properties_inc_ref(MLT_CONSUMER_PROPERTIES(consumer)); // because we explicitly close it// 设置传输回调函数mlt_properties_set_data(MLT_CONSUMER_PROPERTIES(consumer),"transport_callback",transport_action,0,NULL,NULL);}}// If we have no consumer, default to sdlif (store == NULL && consumer == NULL)consumer = create_consumer(profile, NULL);}// Set transport properties on consumer and produderif (consumer != NULL && melt != NULL) {mlt_properties_set_data(MLT_CONSUMER_PROPERTIES(consumer),"transport_producer",melt,0,NULL,NULL);mlt_properties_set_data(MLT_PRODUCER_PROPERTIES(melt),"transport_consumer",consumer,0,NULL,NULL);if (is_progress)mlt_properties_set_int(MLT_CONSUMER_PROPERTIES(consumer), "progress", is_progress);if (is_silent)mlt_properties_set_int(MLT_CONSUMER_PROPERTIES(consumer), "silent", is_silent);if (is_getc)mlt_properties_set_int(MLT_CONSUMER_PROPERTIES(consumer), "melt_getc", is_getc);}if (argc > 1 && melt != NULL && mlt_producer_get_length(melt) > 0) {// Parse the argumentsfor (i = 1; i < argc; i++) {if (!strcmp(argv[i], "-jack") && consumer) {setup_jack_transport(consumer, profile);} else if (!strcmp(argv[i], "-serialise")) {if (store != stdout)i++;} else {if (store != NULL)fprintf(store, "%s\n", argv[i]);i++;while (argv[i] != NULL && argv[i][0] != '-') {if (store != NULL)fprintf(store, "%s\n", argv[i]);i += 1;}i--;}}if (consumer != NULL && store == NULL) {// Get melt's propertiesmlt_properties melt_props = MLT_PRODUCER_PROPERTIES(melt);mlt_properties properties = MLT_CONSUMER_PROPERTIES(consumer);if (is_consumer_explicit) {// Apply group settingsmlt_properties group = mlt_properties_get_data(melt_props, "group", 0);// properties继承mlt_properties_inherit(properties, group);}int in = mlt_properties_get_int(properties, "in");int out = mlt_properties_get_int(properties, "out");if (in > 0 || out > 0) {if (out == 0) {out = mlt_producer_get_length(melt) - 1;}mlt_producer_set_in_and_out(melt, in, out);mlt_producer_seek(melt, 0);}// Connect consumer to meltmlt_consumer_connect(consumer, MLT_PRODUCER_SERVICE(melt));// Start the consumermlt_events_listen(properties,consumer,"consumer-fatal-error",(mlt_listener) on_fatal_error);if (mlt_consumer_start(consumer) == 0) {// Try to exit gracefully upon these signalssignal(SIGINT, stop_handler);signal(SIGTERM, stop_handler);
#ifndef _WIN32signal(SIGHUP, stop_handler);signal(SIGPIPE, stop_handler);
#endif// Transport functionalitytransport(melt, consumer);// Stop the consumermlt_consumer_stop(consumer);}} else if (store != NULL && store != stdout && name != NULL) {fprintf(stderr, "Project saved as %s.\n", name);fclose(store);}} else {show_usage(argv[0]);}// Disconnect producer from consumer to prevent ref cycles from closing servicesif (consumer) {error = mlt_properties_get_int(MLT_CONSUMER_PROPERTIES(consumer), "melt_error");mlt_consumer_connect(consumer, NULL);if (!is_abort)mlt_events_fire(MLT_CONSUMER_PROPERTIES(consumer),"consumer-cleanup",mlt_event_data_none());}if (is_abort)return error;// Close the producerif (melt != NULL)mlt_producer_close(melt);// Close the consumerif (consumer != NULL)mlt_consumer_close(consumer);// Close the factorymlt_profile_close(profile);mlt_profile_close(backup_profile);exit_factory:// Workaround qmelt on OS X from crashing at exit.
#if !defined(__MACH__) || !defined(QT_GUI_LIB)mlt_factory_close();
#endifreturn error;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1045795.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据仓库与数据挖掘(第三版)陈文伟思维导图1-5章作业

第一章 概述 8.基于数据仓库的决策支持系统与传统决策支持系统有哪些区别&#xff1f; 决策支持系统经历了4个阶段。 1.基本决策支持系统 是在运筹学单模型辅助决策的基础上发展起来的&#xff0c;以模型库系统为核心&#xff0c;以多模型和数据库的组合形成方案辅助决策。 它…

2024年第八届人工智能与虚拟现实国际会议(AIVR 2024)即将召开!

2024年第八届人工智能与虚拟现实国际会议&#xff08;AIVR 2024&#xff09;将2024年7月19-21日在日本福冈举行。人工智能与虚拟现实的发展对推动科技进步、促进经济发展、提升人类生活质量等具有重要意义。AIVR 2024将携手各专家学者&#xff0c;共同挖掘智能与虚拟的无限可能…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【unity】【C#】UGUI组件

文章目录 UI是什么对UI初步认识 UI是什么 UI是用户界面&#xff08;User Interface&#xff09;的缩写&#xff0c;它是用户与软件或系统进行交互的界面。UI设计旨在提供用户友好的界面&#xff0c;使用户能够轻松地使用软件或系统。UI设计包括界面的布局、颜色、字体、图标等…

爬虫逆向实战(40)-某江酒店登陆(AES、MD5)

一、数据接口分析 主页地址&#xff1a;某江酒店 1、抓包 通过抓包可以发现数据接口是/api/member/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有TDFingerprint、blackBoxMd5、password和sw四个加密参数&#x…

Java快速入门系列-6(数据库编程与JDBC)

第六章:数据库编程与JDBC 6.1 SQL基础6.1.1 SQL基本结构与命令6.1.2 SQL高级查询6.1.3 SQL子查询与联接6.2 JDBC原理与使用6.2.1 JDBC驱动程序与URL6.2.2 Statement、PreparedStatement与CallableStatement6.2.3 数据库事务处理6.3 数据库连接池6.4 事务管理6.1 SQL基础 SQL(…

数据结构——线性表(链式存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

电商技术揭秘十八:电商平台的云计算与大数据应用小结

电商技术揭秘相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xf…

Day:006(1) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium介绍与安装 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键精灵&#xff0c;可以按指定的命令自动操作&#xff0c;不同是Selenium 可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&am…

社交网络的分布式治理:分析Facebook在区块链社区中的角色

随着区块链技术的快速发展&#xff0c;社交网络的治理模式也逐渐受到关注。传统的社交网络往往由中心化的平台掌控&#xff0c;用户的权力和参与度受到限制&#xff0c;而区块链技术为社交网络的分布式治理提供了新的解决方案。本文将深入探讨社交网络的分布式治理&#xff0c;…

使用R语言计算矩形分布(均匀分布)并绘制图形

理论部分 矩形分布&#xff08;均匀分布&#xff09;&#xff0c;是指在某一区间内&#xff0c;随机变量取任何值的概率都是相同的。这种分布的概率密度函数在一个特定的区间内是一个常数&#xff0c;因此其图形呈现出一个矩形的形状&#xff0c;故得名为“矩形分布”。在概率…

ETLCloud结合kafka的数据集成

一、ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式&#xff0c;一种是离线数据集成&#xff0c;另一种便是我们今天所要介绍的实时数据集成了&#xff0c;两者的区别从名字便可以得知&#xff0c;前者处理的数据是离线的没有时效性的&#xff0c;后者的数据是…

Python学习之-pyechart详解

前言&#xff1a; 什么是pyechart&#xff1f; Pyecharts 是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个由百度开源的数据可视化工具&#xff0c;它提供的图表种类丰富&#xff0c;交互性强&#xff0c;兼容性好&#xff0c;非常适合用于数据分析结果的展示。Pyec…

高标清4K音视频编码处理平台JR600系列

详细介绍&#xff1a; JR600编码处理平台具备6个模组高集成化数字前端综合型设备&#xff0c;每个模块可单独配置&#xff0c;包括4x3G-SDI&#xff08;4KHEVC/H.265)超高清编码板卡、HD-SDI编码板卡、数字/模拟音频编码板卡、模拟视频编码板卡这些功能的组合。因该设备的高度…

酷开科技在大数据及人工智能推动下,成功将酷开系统与AI融合

随着科技的不断发展&#xff0c;以及大数据这个概念的出现&#xff0c;让看似冷冰冰的数字开始具备了温度&#xff0c;开始让数字产生了温暖的价值&#xff0c;也让各个行业看到了大数据的作用。酷开科技生态的核心场景是家庭、是客厅&#xff0c;无论是以酷开科技为代表的OTT&…

3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物

在数据分析过程中&#xff0c;经常需要从一个数据推到另外一个数据&#xff0c;日期数据也是如此&#xff0c;需要从一个日期推到另外一个相关的日期&#xff0c;或者从一群日期推到另外一个相关的日期/一群相关的日期。这一期说的就是日期之间彼此推衍的函数&#xff0c;会比之…

实战项目——智慧社区(一)

1、项目介绍 系统功能 登录、修改密码、登出 &#xff08;1&#xff09;首页 &#xff08;1.1&#xff09;数据统计&#xff1a;小区人员统计对比图&#xff0c;占比图 &#xff08;2&#xff09;物业管理 &#xff08;2.1&#xff09;小区管理&#xff1a;小区数据的增删改…

WordPress PHP内存限制优化,WordPress性能优化,提升WordPress PHP内存,防止内存溢出

它发生在所有WordPress网站所有者和管理员最终&#xff1a;可怕的WordPress内存错误。当你正在为自己的网站添加新的内容或媒体时&#xff0c;突然弹出一条消息&#xff1a;“致命错误&#xff1a;允许的内存大小为xxxxxx字节。”刚刚发生了什么&#xff1f;为什么WordPress会内…