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

FFmpeg: 简易ijkplayer播放器实现--06封装打开和关闭stream

文章目录

      • 流程图
      • stream open
      • stream close

流程图

请添加图片描述

stream open

  • 初始化SDL以允许⾳频输出;
  • 初始化帧Frame队列
  • 初始化包Packet队列
  • 初始化时钟Clock
  • 初始化音量
  • 创建解复用读取线程read_thread
  • 创建视频刷新线程video_refresh_thread
int FFPlayer::stream_open(const char *file_name)
{if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)){av_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");return -1;}// 初始化Frame帧队列if (frame_queue_init(&pictq, &videoq, VIDEO_PICTURE_QUEUE_SIZE_DEFAULT) < 0)goto fail;if (frame_queue_init(&sampq, &audioq, SAMPLE_QUEUE_SIZE) < 0)goto fail;// 初始化Packet包队列if (packet_queue_init(&videoq) < 0 ||packet_queue_init(&audioq) < 0 )goto fail;// 初始化时钟init_clock(&audclk);// 创建解复用器读数据线程read_threadread_thread_ = new std::thread(&FFPlayer::read_thread, this);// 创建视频刷新线程video_refresh_thread_ = new std::thread(FFPlayer::video_refresh_thread, this);return 0;
fail:stream_close();return -1;
}

调用过程
MainWind::OnPlayOrPause()
IjkMediaPlayer::ijkmp_prepare_async()
FFPlayer::ffp_prepare_async_l()
stream_open()

stream close

  • 请求关闭read_thread线程
  • 关闭解复用器
  • 关闭stream,⽐如调⽤stream_component_close:关闭解码线程,释放解码器资源,关闭对应的⾳频、视频设备,包队列,帧队列,释放其他资源
void FFPlayer::stream_close()
{abort_request = 1; // 请求退出if(read_thread_ && read_thread_->joinable()) {read_thread_->join();       // 等待线程退出}/* close each stream */if (audio_stream >= 0)stream_component_close(audio_stream);  // 解码器线程请求abort的时候有调用 packet_queue_abortif (video_stream >= 0)stream_component_close(video_stream);// 关闭解复用器 avformat_close_input(&is->ic);// 释放packet队列packet_queue_destroy(&videoq);packet_queue_destroy(&audioq);// 释放frame队列frame_queue_destory(&pictq);frame_queue_destory(&sampq);if(input_filename_) {free(input_filename_);input_filename_ = NULL;}
}

调用过程
MainWind::OnStop()
IjkMediaPlayer::ijkmp_destroy()
FFPlayer::ffp_destroy()
stream_close();

http://www.lryc.cn/news/336899.html

相关文章:

  • 使用Android完成案例教学
  • 面向对象设计原则实验“依赖倒置原则”
  • PMP考试到底难在哪里?
  • Linux执行命令监控详细实现原理和使用教程,以及相关工具的使用
  • 算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)
  • 【电子通识】热风枪的结构与使用方法
  • mysql知识点
  • css Animation 动画-右进左出
  • 第十三届蓝桥杯省赛大学B组填空题(c++)
  • 天星金融(原小米金融)深耕金融知识领域,助力消费者提升金融素养
  • 中国手机频段介绍
  • 企业如何使用SNP Glue将SAP与Snowflake集成?
  • 算法设计与分析实验报告c++实现(最近点对问题、循环赛日程安排问题、排序问题、棋盘覆盖问题)
  • Vue - 你知道Vue中computed和watch的区别吗
  • POJ2976 Dropping tests——P4377 [USACO18OPEN] Talent Show G 【分数规划二分法+贪心/背包】
  • 【生产实习-毕设】pyspark学生成绩分析与预测(上)
  • 【华为笔试题汇总】2024-04-10-华为春招笔试题(第二套)-三语言题解(CPP/Python/Java)
  • Windows 文件夹被占用无法删除
  • PHP+MySQL组合开发 易企秀H5场景源码系统 带完整的安装代码包以及搭建教程
  • 抖音小店入驻有什么条件?资金少,没经验的普通人做得起吗?
  • 游戏行业科普 (二)游戏是怎么做出来,怎么卖出去的?
  • Java研学-RBAC权限控制(二)
  • 20. 【Android教程】拖动条 SeekBar
  • 工业物联网网关在机械设备制造企业数转过程的应用-天拓四方
  • 《一》Qt的概述
  • 局域网共享文件夹怎么加密?局域网共享文件夹加密方法介绍
  • 计算机网络——网络地址转换(NAT)技术
  • 【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您
  • Android Studio导入第三方so库和jar包——Android Studio
  • jeecg-boot 3.6使用微服务启动详细配置