XDemux.cpp新增

AVPacket *XDemux::Read()
{mux.lock();if (!ic) //容错{mux.unlock();return 0;}AVPacket *pkt = av_packet_alloc();//读取一帧,并分配空间int re = av_read_frame(ic, pkt);if (re != 0){mux.unlock();av_packet_free(&pkt);return 0;}//pts转换为毫秒pkt->pts = pkt->pts*(1000 * (r2d(ic->streams[pkt->stream_index]->time_base)));pkt->dts = pkt->dts*(1000 * (r2d(ic->streams[pkt->stream_index]->time_base)));mux.unlock();cout << pkt->pts << " "<<flush;return pkt;
}

main.cpp新增代码

    for (;;){AVPacket *pkt = demux.Read();if (!pkt)break;}

完整代码如下:

main.cpp

#include "XPlay2.h"#include <QApplication>
#include <iostream>
using namespace std;
#include "XDemux.h"int main(int argc, char *argv[])
{///测试XDemuxXDemux demux;//香港卫视const char *url = "rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp";
//    url = "001111.mp4";cout<<"demux.Open = "<<demux.Open(url);for (;;){AVPacket *pkt = demux.Read();if (!pkt)break;}QApplication a(argc, argv);XPlay2 w;w.show();return a.exec();
}

XDemux.h

#ifndef XDEMUX_H
#define XDEMUX_H#include <mutex>
struct AVFormatContext;
struct AVPacket;class XDemux
{
public://打开媒体文件,或者流媒体 rtmp http rstpvirtual bool Open(const char *url);//空间需要调用者释放 ,释放AVPacket对象空间,和数据空间 av_packet_freevirtual AVPacket *Read();XDemux();virtual ~XDemux();//媒体总时长(毫秒)int totalMs = 0;
protected:std::mutex mux;//解封装上下文AVFormatContext *ic = NULL;//音视频索引,读取时区分音视频int videoStream = 0;int audioStream = 1;};#endif // XDEMUX_H

XDemux.cpp

#include "XDemux.h"
#include <iostream>
using namespace std;
extern "C" {#include "libavformat/avformat.h"
}#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
static double r2d(AVRational r)
{return r.den == 0 ? 0 : (double)r.num / (double)r.den;
}
bool XDemux::Open(const char *url)
{//参数设置AVDictionary *opts = NULL;//设置rtsp流已tcp协议打开av_dict_set(&opts, "rtsp_transport", "tcp", 0);//网络延时时间av_dict_set(&opts, "max_delay", "5000", 0);mux.lock();int re = avformat_open_input(&ic,url,0,  // 0表示自动选择解封器&opts //参数设置,比如rtsp的延时时间);if (re != 0){mux.unlock();char buf[1024] = { 0 };av_strerror(re, buf, sizeof(buf) - 1);cout << "open " << url << " failed! :" << buf << endl;return false;}cout << "open " << url << " success! " << endl;//获取流信息re = avformat_find_stream_info(ic, 0);//总时长 毫秒int totalMs = ic->duration / (AV_TIME_BASE / 1000);cout << "totalMs = " << totalMs << endl;//打印视频流详细信息av_dump_format(ic, 0, url, 0);//获取视频流videoStream = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);AVStream *as = ic->streams[videoStream];cout << "=======================================================" << endl;cout << videoStream << "视频信息" << endl;cout << "codec_id = " << as->codecpar->codec_id << endl;cout << "format = " << as->codecpar->format << endl;cout << "width=" << as->codecpar->width << endl;cout << "height=" << as->codecpar->height << endl;//帧率 fps 分数转换cout << "video fps = " << r2d(as->avg_frame_rate) << endl;cout << "=======================================================" << endl;cout << audioStream << "音频信息" << endl;//获取音频流audioStream = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);as = ic->streams[audioStream];cout << "codec_id = " << as->codecpar->codec_id << endl;cout << "format = " << as->codecpar->format << endl;cout << "sample_rate = " << as->codecpar->sample_rate << endl;//AVSampleFormat;cout << "channels = " << as->codecpar->channels << endl;//一帧数据?? 单通道样本数cout << "frame_size = " << as->codecpar->frame_size << endl;//1024 * 2 * 2 = 4096  fps = sample_rate/frame_sizemux.unlock();return true;
}AVPacket *XDemux::Read()
{mux.lock();if (!ic) //容错{mux.unlock();return 0;}AVPacket *pkt = av_packet_alloc();//读取一帧,并分配空间int re = av_read_frame(ic, pkt);if (re != 0){mux.unlock();av_packet_free(&pkt);return 0;}//pts转换为毫秒pkt->pts = pkt->pts*(1000 * (r2d(ic->streams[pkt->stream_index]->time_base)));pkt->dts = pkt->dts*(1000 * (r2d(ic->streams[pkt->stream_index]->time_base)));mux.unlock();cout << pkt->pts << " "<<flush;return pkt;
}XDemux::XDemux()
{static bool isFirst = true;static std::mutex dmux;dmux.lock();if (isFirst){//初始化封装库av_register_all();//初始化网络库 (可以打开rtsp rtmp http 协议的流媒体视频)avformat_network_init();isFirst = false;}dmux.unlock();
}XDemux::~XDemux()
{}

ffmpeg制作视频播放器(十四)XPlay2 read接口相关推荐

  1. ffmpeg制作视频播放器(十五)XPlay2 音视频参数获取和复制

    XDemux.cpp //获取视频参数 返回的空间需要清理 avcodec_parameters_free AVCodecParameters *XDemux::CopyVPara() {mux.lo ...

  2. ffmpeg制作视频播放器(十三)XPlay2 open接口

    main.cpp #include "XPlay2.h"#include <QApplication> #include <iostream> using ...

  3. ffmpeg制作视频播放器(六)读取视频帧,音频帧

    pts:显示时间戳*time_base=以秒为单位的显示时间 #include <iostream> extern "C"{ #include "libavf ...

  4. 基于FFmpeg的视频播放器之十五:录像

    一.效果 1.录制视频 2.播放录制的视频 二.原理 将上一篇基于FFmpeg的视频播放器之十四:remuxing中的代码直接用于录像是行不通的,会存在下列问题. 1.因为可以从任意时间点开始录制,此 ...

  5. QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染(四)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  6. FFmpeg+SDL视频播放器

    本博客是摘自雷霄骅大神的课程<基于 FFmpeg + SDL 的视频播放器的制作>课程 里的内容,非常适合音视频小白入门,在这里感谢雷神的指导! 目录 FFmpeg和SDL的整合实现视频播 ...

  7. QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  8. QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  9. QT软件开发-基于FFMPEG设计视频播放器-GPU硬解、OpenGL渲染、解码音频完整例子(六)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

最新文章

  1. 中国剩余定理(Chinese Remainder Theorem)
  2. 简单的UIButton按钮动画效果iOS源码
  3. java 有多少api_Java常用API(二)
  4. 深度运用LSTM神经网络并与经典时序模型对比
  5. kFeedback开源啦
  6. 不能从远程创建com+对象_红蓝对抗攻防实战:寻找COM对象
  7. Android学习笔记(27):日历视图Calendar
  8. 第八届蓝桥杯JavaB---承压计算
  9. JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
  10. linux运行j2me,Linux下用Eclipse搭建J2me开发环境过程
  11. 线性代数-距离公式汇总
  12. 【电路】电容(三)——耦合、退耦电容
  13. 计算机蓝屏一直重启,笔记本电脑开机蓝屏不断重启问题的解决方法
  14. “强省会”从产业开始,长沙市智能汽车产业促进会正式授牌
  15. origin基本操作
  16. 计算机本科生论文都抽查什么,本科生毕业论文抽查,抄袭马上会被撤销学位,学生最好别违规...
  17. Flutter防微信还原度最高开发日志
  18. 四百元左右有什么降噪耳机推荐?高性价比降噪耳机推荐
  19. 购买PG霜,请认准官方网站
  20. Word中断开表格的办法

热门文章

  1. php搜索配置cms,迅睿CMS 模块搜索设置
  2. 哈工大计算机学院非全日制,如何选择哈尔滨工业大学非全日制与全日制研究生?...
  3. 2019年华北五省计算机应用大赛官网,【喜讯】我校学子在2019年华北五省(市、自治区)及港澳台大学生计算机应用大赛中获佳绩-天津城建大学...
  4. oracle dg 数据不一致,DG常用运维命令及常见问题解决
  5. 《通信原理》课后题 樊昌信
  6. 错误 1 error MSB3721: 命令#34#C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\bin\nvcc.exe#34
  7. 青火互联的防伪系统解决方案-防伪SaaS云平台介绍
  8. 魔众一物一码溯源防伪系统 v1.1.0 页面SEO优化,系统升级调整
  9. 在DELL R730上安装CentOS或Ubuntu,VMware workstation 使用物理硬盘(解决不识别物理硬盘的问题)
  10. 中国机械式停车设备深度调研与投资战略报告(2021版)