最下方有我借鉴了雷神以及一位大哥的文章后自己写的简易播放器。免费下载。仅供大家参考。

下面的文章是雷神的文章:

最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)_雷霄骅的博客-CSDN博客_ffmpeg sdl之前做过一个FFMPEG+SDL的简单播放器:《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》。最近有不少人反映SDL已经升级到2.0版本了,甚至官网的Wiki上都只有SDL2.0的文档了,因此下载了SDL 2.0 并且进行了简单的研究。随后对此前的播放器进行了修改,将SDL1.2换成了SDL2.0。注:《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》文章中提到的很多知识这里不再重复。本文重点记录SDL1.2与SDL2.0的不同。https://blog.csdn.net/leixiaohua1020/article/details/38868499以及我所借鉴的另一位大哥的文章:

QT、FFmpeg、SDL2视频播放器(一)_倾我一生来读的博客-CSDN博客_qt sdl2之前使用ffmpeg和sdl2制作过一个简单的视频播放器,视频的播放暂停完全是sdl event控制,现在希望将sdl嵌入到QT 窗口中,通过一系列qt按钮实现播放、暂停的控制。1 核心思想1 QT多线程因为视频解码过程消耗资源较多,必须单独开启一个线程来负责视频解码,主线程负责渲染以及控制,否则视频播放的过程中UI会卡住,无法响应用户事件。QT实现多线程有两种方法:第一种是创建一个线程,类继承QThread,并且重写run方法,主线程中创建线程对象,使用start()方法启动线程,该部分网络上资料https://blog.csdn.net/qq_38694388/article/details/120684650?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165191343016782391899854%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165191343016782391899854&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-120684650-null-null.nonecase&utm_term=%E6%92%AD%E6%94%BE%E5%99%A8&spm=1018.2226.3001.4450Player.h

class Player:public QObject
{Q_OBJECT
public:Player(QObject *parent = nullptr);
public:bool isPlay;bool isPause;float seekPos;bool doSeek;signals:void sigGetFrame(AVFrame *pFrame);void sigGetVideoInfo(int mWidth,int mHeight);void sigGetCurrentPts(long totalTime, long currentTime);public slots:void slotDoWork(const QString &add);
};

Player.cpp

#include "Player.h"
#include"CCycleBuffer.h"
static  Uint8  *audio_chunk;
static  Uint32  audio_len;
static  Uint8  *audio_pos;
CCycleBuffer* pSoundBuf;
#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
void mSleep(int msec)
{QTime n=QTime::currentTime();QTime now;do{now=QTime::currentTime();}while (n.msecsTo(now)<=msec);
}Player::Player(QObject *parent):QObject (parent)
{}void Player::slotDoWork(const QString &add)
{AVFormatContext *avFormatContext = nullptr;AVPacket *packet = (AVPacket *)malloc(sizeof(AVPacket));AVFrame   *pFrame = nullptr,*audioFrame=nullptr;//SDL_AudioSpec wanted_spec;//pSoundBuf = new CCycleBuffer(192000 * 10);int audioStream= -1;int videoStream = -1;int err = -1;QByteArray ba=nullptr;ba=add.toLatin1();char * fileName = ba.data();isPlay = true;isPause = false;doSeek = false;int64_t in_channel_layout;struct SwrContext *au_convert_ctx;av_register_all();avformat_network_init();avFormatContext = avformat_alloc_context();if (!avFormatContext) {av_log(nullptr, AV_LOG_FATAL, "Could not allocate context.\n");}AVDictionary *dic=NULL;int ret=av_dict_set(&dic,"bufsize","655360",0);if(avformat_open_input(&avFormatContext, fileName, nullptr, &dic) != 0){qDebug() << "Couldn't open file";}// Retrieve stream informationif(avformat_find_stream_info(avFormatContext, nullptr)<0){qDebug() << "Couldn't find stream information";return;}av_dump_format(avFormatContext, 0, fileName, false);for(unsigned int i=0; i < avFormatContext->nb_streams; i++){if(avFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){audioStream = static_cast<int>(i);}else if(avFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){videoStream = static_cast<int>(i);}}if(audioStream == -1 && videoStream == -1){qDebug() << "Didn't find a audio stream";return;}pFrame = av_frame_alloc();//视频AVCodecContext *pVideoCodecContext = nullptr,*pAudioCodecContext=nullptr;AVCodec          *pCodecVideo,*pCodecAudio;AVCodecParameters *pVideoChannelCodecPara = nullptr,*pAudioChannelCodecPara = nullptr;
//    pAudioCodecContext=avFormatContext->streams[audioStream]->codec;
//    pCodecAudio=avcodec_find_decoder(pAudioCodecContext->codec_id);
//    if (avcodec_open2(pAudioCodecContext, pCodecAudio, NULL) < 0)
//        {
//            printf("Could not open audio codec.\n");
//        }
//    audioFrame=av_frame_alloc();if(videoStream != -1){//视频pVideoChannelCodecPara = avFormatContext->streams[videoStream]->codecpar;pVideoCodecContext =  avcodec_alloc_context3(nullptr);if (!pVideoCodecContext){qDebug() <<  "avcodec_alloc_context3";return;}err = avcodec_parameters_to_context(pVideoCodecContext, pVideoChannelCodecPara);if (err < 0){qDebug() << "avcodec_parameters_to_context";return;}pCodecVideo = avcodec_find_decoder(pVideoChannelCodecPara->codec_id);if(pCodecVideo == nullptr){qDebug() <<  "avcodec_find_decoder";return;}qDebug() << "编解码器名:" << pCodecVideo->long_name;err = avcodec_open2(pVideoCodecContext, pCodecVideo, nullptr);if(err){qDebug() << "avcodec_open2";return;}emit sigGetVideoInfo(pVideoCodecContext->width, pVideoCodecContext->height);qDebug() << "视频宽度:" << pVideoCodecContext->width << "高度:" << pVideoCodecContext->height;}av_init_packet(packet);for (;;) {//Play//SDL_PauseAudio(0);if (isPause){mSleep(1000);}else if (doSeek){int64_t stamp = 0;stamp = seekPos * avFormatContext->streams[videoStream]->duration;//当前它实际的位置int ret = av_seek_frame(avFormatContext, videoStream, stamp,AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_FRAME);//将视频移至到当前点击滑动条位置emit sigGetCurrentPts(avFormatContext->duration * av_q2d(pVideoCodecContext->time_base),stamp * av_q2d(pVideoCodecContext->time_base));stamp * av_q2d(pVideoCodecContext->time_base);qDebug() << seekPos;doSeek = false;mSleep(50);}else{if(av_read_frame(avFormatContext, packet) < 0){goto end;}if(packet->stream_index == videoStream){err = avcodec_send_packet(pVideoCodecContext, packet);if(err != 0){if(AVERROR(EAGAIN) == err)continue;qDebug() << "发送视频帧失败!"<<  err;}//解码while(avcodec_receive_frame(pVideoCodecContext, pFrame) == 0){emit sigGetFrame(pFrame);mSleep(15);emit sigGetCurrentPts(avFormatContext->duration * av_q2d(pVideoCodecContext->time_base),pFrame->pts * av_q2d(pVideoCodecContext->time_base));mSleep(20);}}else{av_packet_unref(packet); // 注意清理,容易造成内存泄漏continue;}if (!isPlay){goto end;}}}
end:av_frame_free(&pFrame);avformat_close_input(&avFormatContext);avcodec_close(pVideoCodecContext);avformat_close_input(&avFormatContext);qDebug() << "end of play";
}

这是我自己写的播放器的运行图片

项目下载地址我放在我自己资源里面,免费下载的,库文件可能需要大家下载一下。

免费下载,仅供参考,更深度学习请移步雷神博客。

ffmpeg+SDL2的简易流媒体播放器,仅供大家参考学习。缺少dll库,在我资源里面下载ffmpeg+SDL2较新发布那个有。-编解码文档类资源-CSDN下载

基于QT+ffmpeg+SDL2的流媒体播放器相关推荐

  1. android 流播放器开发,GitHub - youcoding98/FastVideo: 基于Android平台的移动流媒体播放器的开发...

    基于Android平台的移动流媒体播放器的开发 主页界面如下 第一部分 课题相关介绍 与普通播放器相比,流媒体播放器最主要的不同点在于其能够实现实时的视频播放,用户可以实现边加载边播放,不需要一次全下 ...

  2. 基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件

    [开源]基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件 码云地址 https://gitee.com/Barryda/QtScrcpy github地址 https://github. ...

  3. 基于QT的网络音乐播放器(一)

    自学Qt已经有一段时间了,但是始终感觉自己还是很弱(其实并不是感觉自己很弱,是自己本来就很弱,哈哈).自己也照着书上敲了几个例子,但觉得还是要写点东西才能真正运用起来.所以,前段时间就写了个很简单的音 ...

  4. 基于QT ffmpeg的动态桌面壁纸

    基于QT ffmpeg的动态桌面壁纸 目前制作了一个基于QT ffmpeg的动态桌面壁纸,源码程序在github上 下面为链接: 动态壁纸软件 项目名为 DesktopDynamicWallpaper ...

  5. 【基于Qt的在线音乐播放器】

    基于Qt的在线音乐播放器 项目功能: 本在线音乐播放器的功能在于创建一个音乐播放器页面,可以实现搜索功能通过HTTP协议获取网络中数据并解析出来,播放搜索到的歌曲并展示相关信息.效果如图: 相关类及功 ...

  6. 基于QT开发的音乐播放器(附源码)

    基于QT开发的音乐播放器(附源码) 一.简介 1.介绍 2.功能描述 3.系统功能层次模块图 4.各模块功能描述 (1)播放界面 (2)歌词 (3)歌曲信息 (4)歌曲列表 5.文件格式 6.运行环境 ...

  7. FFmpeg+SDL2音频播放器

    基于雷神最简单的音频播放器修改. /** * 最简单的基于FFmpeg的音频播放器 2 * Simplest FFmpeg Audio Player 2 * * 雷霄骅 Lei Xiaohua * l ...

  8. 画出android音乐播放器的类图,基于Qt图形框架音乐播放器的设计与实现

    随着互联网软件行业的快速发展,应用市场的软件种类更是琳琅满目,其中,生活娱乐类的软件种类最为繁多,就以本文涉及到的音乐播放器(多媒体)来说,国内目前的主流音乐播放器有QQ音乐.酷狗音乐.百度音乐.网易 ...

  9. 基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.效果图 2.准备好前面获取的酷狗api接口 3.网络歌曲搜索实现 4.网络歌曲播放的实现 ...

  10. Qt+VLC编写的流媒体播放器

    我是一名大四的学生,今年的毕业设计编写了这个播放器,主要功能是播放音频广播和电视直播.现在毕业答辩已经完成,我放出源码和可执行程序跟大家分享.注意:请勿将该项目用于任何学习交流以外的用途! 音频界面: ...

最新文章

  1. 关于无线节能组无线电能输出功率测量
  2. Java实现字符全阵列阵列
  3. 实际电压/流源模型及其等效分析
  4. GCN图卷积网络入门详解
  5. MySQL数据库事务隔离性的实现
  6. java 解决死锁_如何解决java中的死锁问题
  7. signature=348a7ccbb9abe65fb90d6a0f44514435,Built-in self test for memory interconnect testing
  8. git 打tag_团队开发中的 Git 实践
  9. 创新方法(TRIZ)理论及应用
  10. mysql for in 循环_groovy循环-for-in 语句 - Groovy教程
  11. Sendmail和Openwebmail构建Linux下的Emai服务器
  12. 常州大学/教务系统/教室相关
  13. 网易云音乐外链(PHP的curl函数)
  14. Keyword Spotting (KWS) | Deep Spoken Keyword Spotting: An Overview
  15. golang中channel的传递
  16. eclipse 上传代码到github,我花费了一个月测的。就这样了
  17. mac 无法打开22端口 无法远程连接ssh 的解决办法
  18. 使用微信web开发者工具调试微信企业号页面
  19. 2019年秋季学期实验室安全考试1
  20. Java项目安全问题及解决方案

热门文章

  1. xp无法连接win10计算机,win10共享的打印机xp无法连接
  2. html轮播图片在线制作,如何制作图片轮播?轮播图在线制作技巧
  3. windows服务器虚拟机 全屏,win7虚拟机的安装|vmware中win7虚拟机怎么设置全屏显示...
  4. e站app里站hosts_流浪e站
  5. 1、植物大战僵尸:修改配置
  6. matlab算kappa系数,[转载]Kappa系数的计算及应用
  7. 使用n2disk和PF_RING构建一个(便宜的)2×10 Gbit(连续)数据包记录器
  8. Qt添加分割线(很简单的方法)
  9. CDH集群更换IP处理方法
  10. Docker 网络之bridge外部世界如何访问容器