当前位置: 首页 > news >正文

洛阳便宜网站建设费用网站建设专业网站设计公司物格网

洛阳便宜网站建设费用,网站建设专业网站设计公司物格网,网页制作人员培训课程,wordpress获取文章内图片不显示ffplay源码分析-main函数入口分析 基于ffmpeg6.0源码分析。 流程 使用ffplay播放视频文件#xff0c;会触发main函数的调用。main函数中会进行以下操作#xff1a; 从命令行中解析日志级别、日志是否需要落文件、是否要输出banner信息。banner信息包含版权、库的版本。注…ffplay源码分析-main函数入口分析 基于ffmpeg6.0源码分析。 流程 使用ffplay播放视频文件会触发main函数的调用。main函数中会进行以下操作 从命令行中解析日志级别、日志是否需要落文件、是否要输出banner信息。banner信息包含版权、库的版本。注册解码器、复用器、协议。 avdevice_register_all会将输出formats和输入formats注册到allformats.c的变量中。 allformat.c void avpriv_register_devices(const FFOutputFormat * const o[], const AVInputFormat * const i[]) {// 还是个原子操作赋值。atomic_store_explicit(outdev_list_intptr, (uintptr_t)o, memory_order_relaxed);atomic_store_explicit(indev_list_intptr, (uintptr_t)i, memory_order_relaxed); }alldevices.c void avdevice_register_all(void) {avpriv_register_devices(outdev_list, indev_list); }其中outdev_list来自outdev_list.c文件idev_list来自indev_list.c文件。这2个文件是自动生成的。所以我猜它是根据我们不同的配置来生成不同的内容。 我的indev_list.c static const AVInputFormat * const indev_list[] { ff_avfoundation_demuxer, ff_lavfi_demuxer, NULL };我的outdev_list.c static const FFOutputFormat * const outdev_list[] { ff_audiotoolbox_muxer, ff_sdl2_muxer, NULL };初始化网络会根据使用的是openssl还是guntls进行初始化对于window有可能需要调用一下WSAStartupms-socket。 void ff_tls_deinit(void) { #if CONFIG_TLS_PROTOCOL #if CONFIG_OPENSSLff_openssl_deinit(); #endif #if CONFIG_GNUTLSff_gnutls_deinit(); #endif #endif }int ff_network_init(void) { #if HAVE_WINSOCK2_HWSADATA wsaData;// Windowsif (WSAStartup(MAKEWORD(1,1), wsaData))return 0; #endifreturn 1; }监听程序退出信号这一步是为了能响应用户关闭程序的操作。比如在播放过程中在命令行中按ctrl-c就会退出程序。 static void sigterm_handler(int sig) {exit(123); }显示banner信息banner信息包含版本、配置等。 void show_banner(int argc, char **argv, const OptionDef *options) {int idx locate_option(argc, argv, options, version);if (hide_banner || idx)return;// 打印ffmpeg的版本版权信息、配置信息print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);// 打印子库的配置信息print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_INFO);// 打印字库的版本信息print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO); }解析命令行参数得到需要播放的文件解析成功之后全局变量input_filename存储的就是输入的文件。 void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,void (*parse_arg_function)(void *, const char*)) {const char *opt;int optindex, handleoptions 1, ret;prepare_app_arguments(argc, argv); // 空的不用管optindex 1;while (optindex argc) {opt argv[optindex];if (handleoptions opt[0] - opt[1] ! \0) {if (opt[1] - opt[2] \0) {handleoptions 0; // 如果参数是-- 即没有拼参数名则跳过。continue;}opt;// 如果小于0说明解析参数发生了错误。if ((ret parse_option(optctx, opt, argv[optindex], options)) 0)exit_program(1); // 退出程序。optindex ret;} else {if (parse_arg_function) // 如果上一个参数是跳过的(handleoptiongs是0),或者参数不是-开始的一个字符串不能只是一个-则执行这个函数。parse_arg_function(optctx, opt); // 这种情况opt可能是要处理文件。}} } // parse_arg_function 就指向这个函数 static void opt_input_file(void *optctx, const char *filename) {if (input_filename) {av_log(NULL, AV_LOG_FATAL,Argument %s provided as input filename, but %s was already specified.\n,filename, input_filename);exit(1);}if (!strcmp(filename, -))filename fd:;input_filename filename; // 要播放的输入文件。 }如果没解析到要播放的文件输出帮助信息并退出程序。初始化SDL库ffplay播放音频、视频都用到SDL库。根据用户的配置、SDL的版本、来设置SDL显示窗口的配置比如是否显示窗口边界。使用默认大小来创建一个SDL窗口。 int flags SDL_WINDOW_HIDDEN;if (alwaysontop) #if SDL_VERSION_ATLEAST(2,0,5)flags | SDL_WINDOW_ALWAYS_ON_TOP; #elseav_log(NULL, AV_LOG_WARNING, Your SDL version doesnt support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n); #endifif (borderless) // 命令参数可以控制flags | SDL_WINDOW_BORDERLESS; // 控制SDL显示的窗口是否需要边界elseflags | SDL_WINDOW_RESIZABLE;#ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITORSDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, 0); #endif// 使用默认大小、窗口配置flags创建窗口。window SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, linear); // https://wiki.libsdl.org/SDL2/SDL_HINT_RENDER_SCALE_QUALITY创建rendererrenderer是SDK绘制图形必须要用到的东西。以及是否有可用的texture。 if (window) {// 创建renderer, 可以用这个画图形。renderer SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if (!renderer) {av_log(NULL, AV_LOG_WARNING, Failed to initialize a hardware accelerated renderer: %s\n, SDL_GetError());renderer SDL_CreateRenderer(window, -1, 0);}if (renderer) {if (!SDL_GetRendererInfo(renderer, renderer_info)) // 获取renderer的信息。av_log(NULL, AV_LOG_VERBOSE, Initialized %s renderer.\n, renderer_info.name);}}if (!window || !renderer || !renderer_info.num_texture_formats) { // 如果没有渲染的条件则退出程序。av_log(NULL, AV_LOG_FATAL, Failed to create window or renderer: %s, SDL_GetError());do_exit(NULL);}... 打开输入文件。进入循环监听键盘、鼠标事件循环渲染视频。 代码 int main(int argc, char **argv) {int flags;VideoState *is; // 用来保存全局状态init_dynload(); // 仅window会有用安全问题会将当前目录从DLL库搜索目录中删除。av_log_set_flags(AV_LOG_SKIP_REPEATED); // 设置日志如果是重复文案是否跳过parse_loglevel(argc, argv, options); // 从参数中解析日志级别、日志是否要落文件、是否要输出banner信息。/* register all codecs, demux and protocols */ #if CONFIG_AVDEVICEavdevice_register_all(); #endifavformat_network_init();// 处理用户退出程序操作。 https://zh.m.wikipedia.org/wiki/Unix%E4%BF%A1%E5%8F%B7#SIGTERMsignal(SIGINT , sigterm_handler); /* Interrupt (ANSI). Ctrl-C */signal(SIGTERM, sigterm_handler); /* Termination (ANSI). when user terminate */// 显示banner, 就是打印动态库的版权、版本等信息。show_banner(argc, argv, options);parse_options(NULL, argc, argv, options, opt_input_file);if (!input_filename) {show_usage(); // 如果没有从参数中解析出要播放的文件输出错误日志提示用户并退出程序。av_log(NULL, AV_LOG_FATAL, An input file must be specified\n);av_log(NULL, AV_LOG_FATAL,Use -h to get full help or, even better, run man %s\n, program_name);exit(1);}if (display_disable) { // 用户参数可以控制这个开关默认关闭。video_disable 1;}flags SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER; // 设置SDL初始化时的flags。包含了SDL音频子系统、SDL视频子系统、SDL时间子系统、事件子系统。if (audio_disable) // // 用户参数可以控制这个开关默认关闭。flags ~SDL_INIT_AUDIO;else {/* Try to work around an occasional ALSA buffer underflow issue when the* period size is NPOT due to ALSA resampling by forcing the buffer size. */if (!SDL_getenv(SDL_AUDIO_ALSA_SET_BUFFER_SIZE)) // 奇怪的fix.SDL_setenv(SDL_AUDIO_ALSA_SET_BUFFER_SIZE,1, 1);}if (display_disable)flags ~SDL_INIT_VIDEO;if (SDL_Init (flags)) { // 初始化SDLhttps://wiki.libsdl.org/SDL2/SDL_Initav_log(NULL, AV_LOG_FATAL, Could not initialize SDL - %s\n, SDL_GetError());av_log(NULL, AV_LOG_FATAL, (Did you set the DISPLAY variable?)\n);exit(1);}// 不监听系统事件和用户自定义事件。https://wiki.libsdl.org/SDL2/SDL_EventSDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);SDL_EventState(SDL_USEREVENT, SDL_IGNORE);if (!display_disable) {int flags SDL_WINDOW_HIDDEN;if (alwaysontop) #if SDL_VERSION_ATLEAST(2,0,5)flags | SDL_WINDOW_ALWAYS_ON_TOP; #elseav_log(NULL, AV_LOG_WARNING, Your SDL version doesnt support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n); #endifif (borderless)flags | SDL_WINDOW_BORDERLESS; // 控制SDL显示的窗口是否需要边界elseflags | SDL_WINDOW_RESIZABLE;#ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITORSDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, 0); #endif// 使用默认大小、窗口配置flags创建窗口。window SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, linear); // https://wiki.libsdl.org/SDL2/SDL_HINT_RENDER_SCALE_QUALITYif (window) {// 创建renderer, 可以用这个画图形。renderer SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if (!renderer) {av_log(NULL, AV_LOG_WARNING, Failed to initialize a hardware accelerated renderer: %s\n, SDL_GetError());renderer SDL_CreateRenderer(window, -1, 0);}if (renderer) {if (!SDL_GetRendererInfo(renderer, renderer_info)) // 获取renderer的信息。av_log(NULL, AV_LOG_VERBOSE, Initialized %s renderer.\n, renderer_info.name);}}if (!window || !renderer || !renderer_info.num_texture_formats) { // 如果没有渲染的条件则退出程序。av_log(NULL, AV_LOG_FATAL, Failed to create window or renderer: %s, SDL_GetError());do_exit(NULL);}}// 打开输入文件, 如果用户强制设置了fmt file_iformat则不为nullis stream_open(input_filename, file_iformat);if (!is) {av_log(NULL, AV_LOG_FATAL, Failed to initialize VideoState!\n);do_exit(NULL);}// 循环,监听键盘事件、刷新界面。event_loop(is); /* never returns */return 0; }
http://www.hkea.cn/news/14352879/

相关文章:

  • 网站开发图前端开发工程师招聘
  • wap网站开发多少钱网站设计与开发公司
  • 昆明企业做网站wordpress多专题模版
  • 网站备案号取消原因种子搜索引擎 磁力天堂
  • 做网站行业怎么样快速做网站视频
  • 网站允许flash搜索指数在线查询
  • 义乌建设局网站定制企业网站
  • 餐饮美食网站模板源码网站建设或网站优化排名
  • 文登住房和建设局网站外贸网站建设 推广
  • 中国建设银行集团网站找人做网站需要交接什么
  • 南通市区有哪几家做网站的建立网站的技术
  • 深圳机械网站建设自己开发一款app软件
  • 网站建设合同 售后维护期中山百度推广优化排名
  • 上海浦东建筑建设网站丽水微信网站建设哪家好
  • 学校如何建网站石家庄划定6个高风险区
  • 官方网站建设项目询价有人有片视频吗免费的下载
  • 优秀企业网站建设做外单要上什么网站
  • 做网站用tomcat做网站对程序员说那些需求
  • 湖南佳程建设有限公司网站上海巴士公司
  • 北京经济技术开发区建设局网站南阳做玉器网站
  • 都匀网站开发7万字短篇小说哪家网站做的好
  • 网站后台开发教程室内设计师培训网
  • 网站制作费一般多少中山 在门户网站推广
  • 长沙武广新城建设网站快捷的赣州网站建设
  • 网站开发需求文档案例做网站如何买量
  • 锐酷网站建设教程山东滨州网站建设公司
  • 蒲城做网站qq代刷网站社区建设
  • 渭南网站建设公司电话站长统计
  • 网站域名建设免费h5网站制作平台
  • 团队做网站的收获温州做网站定制