播放器实战08 打开AVCODEC
先来看两个编解码有关的数据结构:
AVCodec:包含了编解码器的一些方法,比如在解码时将packet发给解码器时的代码如下:
re = avcodec_send_packet(av, pkt);
将指向编解码器的指针与pkt一起给avcodec_send_packet函数
AVCodecContext:作为编解码器的上下文,包含了编解码器的环境,简单来说,AVCodec是说如何编解码,这个就是告诉他相应属性设置,如对应视频来说,长宽,以及编码相应设置是否包含B桢,GOP是多少等。
///02找视频解码器,const AVCodec *vcodec=avcodec_find_decoder(ic->streams[videoindex]->codecpar->codec_id);if (!vcodec){cout << "can't find the codec id" << ic->streams[videoindex]->codecpar->codec_id << endl;getchar();return -1;}cout<< " find the video codec id"<< ic->streams[videoindex]->codecpar->codec_id << endl;///03创建解码器上下文AVCodecContext *vc=avcodec_alloc_context3(vcodec);///04配置解码器上下文参数avcodec_parameters_to_context(vc, ic->streams[videoindex]->codecpar);//八线程解码vc->thread_count = 8;///05打开解码器上下文re = avcodec_open2(vc, 0, 0);if (re != 0){char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf) - 1);cout << "open audio codec failed!" << buf << endl;getchar();return -1;}cout << "video codec success!" << endl;
01注册解码器
avcodec_register_all()也被弃用了,在新版ffmpeg中不需要注册
02找视频解码器
在读帧前进行该操作,可通过av_find_best_stream()来找:
先定义一个指向AVcodec的常量指针vcodec,
av_find_best_stream()的第五个参数为AVCodec的二级指针,用于改变vcodec的指向
但这样的话解码和解封装在一起,耦合度太大,这里用id号获取
const AVCodec *vcodec=avcodec_find_decoder(ic->streams[videoindex]->codecpar->codec_id);
但有可能找不到流中的解码器号,这里要做个判断看看是否找到解码器
if (!vcodec)
{cout << "can't find the codec id" << ic->streams[videoindex]->codecpar->codec_id << endl;getchar();return -1;
}
03创建解码器上下文
AVCodecContext *vc=avcodec_alloc_context3(vcodec);
将指向解码器的指针传入,开辟一块空间用于放置解码器相关的信息,该空间用vc标记
04配置解码器上下文参数
avcodec_parameters_to_context(vc, ic->streams[videoindex]->codecpar);
将流中的codec参数复制到解码器上下文中
05打开解码器上下文
re = avcodec_open2(vc, 0, 0);
第二个参数是解码器codec,但在03创建上下文的时候已经传进去了,这里就不用再传了,设为0就行了
if (re != 0)
{char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf) - 1);//用buf存放错误信息cout << "open audio codec failed!" << buf << endl;getchar();return -1;
}
打开音频解码同理,改下名字就行了:
///01注册解码器//avcodec_register_all()也被弃用了///02找视频解码器,在读帧前进行该操作,可通过av_find_best_stream()来找,但这样的话解码和解封装在一起,耦合度太大,这里用id号获取const AVCodec* acodec = avcodec_find_decoder(ic->streams[audioindex]->codecpar->codec_id);//有可能找不到流中的解码器号,这里要做个判断看看是否找到解码器if (!vcodec){cout << "can't find the codec id" << ic->streams[audioindex]->codecpar->codec_id << endl;getchar();return -1;}cout << " find the audio codec id" << ic->streams[audioindex]->codecpar->codec_id << endl;///03创建解码器上下文AVCodecContext* ac = avcodec_alloc_context3(acodec);//将指向解码器的指针传入,开辟一块空间用于放置解码器相关的信息///04配置解码器上下文参数avcodec_parameters_to_context(ac, ic->streams[audioindex]->codecpar);//将流中的codec参数复制到解码器上下文中//八线程解码vc->thread_count = 8;///05打开解码器上下文re = avcodec_open2(ac, 0, 0);//第二个参数是解码器codec,但在创建上下文的时候已经传进去了,这里就不用再传了if (re != 0){char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf) - 1);//用buf存放错误信息cout << "open audio codec failed!" << buf << endl;getchar();return -1;}cout << "video codec success!" << endl;
播放器实战08 打开AVCODEC相关推荐
- 播放器实战28 总结
至此,播放器的基本功能已经实现,进行一个总结: 一,仅进行播放时的函数调用流程 只做一个大致的梳理且不涉及seek等操作): 01.QT中的整个控件为QWidget类,Xplay2类为其继承,在mai ...
- 播放器实战19 Xaudio打开音频
1.xaudio.h #pragma once class xaudioplay {public:static xaudioplay* get();xaudioplay();//一定得是虚析构函数,d ...
- Windows10环境下设置播放器默认软件打开方式
咳咳咳-简单的记录一下,毫无技术含量的高端操作. 1.设置默认播放器 2.设置默认PDF等类型的文件打开 OK end.........
- vue实现音乐播放器实战笔记
一.项目说明 该播放器的是基于学习vue的实战练习,不用于其他途径.应用中的全部数据来自于 QQ音乐 移动端(https://m.y.qq.com/),利用 jsonp 以及 axios 代理后端请求 ...
- 基于 Vue 的直播播放器实战
原文地址:点击进入 前言 时下直播的盛行让很多人对直播技术产生浓厚的兴趣,orange 本人也不例外,本文借着实战的目的完成一个 demo,并没有深入的讲解直播技术的实现原理以及推流和拉流的实现,为什 ...
- 阿里web播放器微信浏览器打开进度条设置和时间获取
解决的问题: 1.阿里云的web播放器:移动端(安卓是红米手机和苹果11)在微信浏览器打开适用,pc端谷歌浏览器打开适用,其他没测. 2.全代码直接用,进度条没办法完全禁止拖动,只能快进就让他回到上一 ...
- vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...
- 妙味课堂H5音乐播放器实战视频课程 ajax实战教程
课程介绍: 本次课程涉及的知识点包括移动端H5.CSS3.JS.滑屏.HTTP协议.AJAX.跨域.前后端交互.PHP.mySql.jQuery--配合这些知识点,讲师写了一个H5播放器demo,用来 ...
- 后端实体类接收数组_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目...
项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...
最新文章
- dev里timeedit控件如何赋值_抽奖程序里的字节跳动模式和时长控制,让抽奖更有仪式感!...
- 什么样的人贷款更容易?
- 有效的Java –所有对象通用的方法
- Jelinek-Merer与Absolute discounting 平滑方法
- mybatis-config.xml常用的配置信息
- 记录自己的第一次实习
- java 图片处理工具类(图片简单处理 java原生)
- SketchUp 有哪些实用的插件?
- 软件测试之测试的分类
- 非常全面详细的Sklearn介绍
- 406个银英稀有精英名称
- 小武学fpgaStep2
- 百度“文心一言”首批生态合作伙伴公布,Moka接入打造人力资源数字化人AI服务
- win10配置apache
- 人工智能技术在银行客服中心的应用风险-笔记
- MindMapper 总结SQL Server
- 现代计算机之父—冯·诺依曼
- CVE-2016-2183 解决方法
- 人脸识别的关键技术及原理
- 计算机科学文献中英文对照,计算机科学和技术英文文献.doc
热门文章
- 微信小程序 界面从右边滑出_微信小程序页面溢出左右滑动问题
- 未能找到类型或命名空间名称“DllImport“(是否缺少using指令或程序集引用?)
- python两个csv表数据合并_python – 根据列中的数据合并两个CSV文件
- 服务器系统部署方案,系统部署方案.doc
- 在剧里跟“刘亦菲”学营销:地推撬动“社交播传”
- LoRaWAN协议-物理层(PHY)详解
- linux 操作excel文件,Linux下输出excel文件
- 【数据结构Python描述】手动实现一个list列表类并分析常用操作时间复杂度
- 生成式对抗网络(GAN)简介
- 嵌入式面试(笔试)笔记2