音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)

这篇具有很好参考价值的文章主要介绍了音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(二)

解析

在本文中,我们将解析用来解封装的线程的线程类 demuxthread,我们先看看总体的 .h 代码

#pragma once
#ifndef DEMUXTHREAD_H_
#define DEMUXTHREAD_H_
#include"thread.h"
#include"avpacketqueue.h"

#ifdef __cplusplus

extern "C" {
#include"libavutil/avutil.h"
#include"libavformat/avformat.h"
}

#endif // __cplusplus


class DemuxThread : public Thread
{
public:
	DemuxThread(AVPacketQueue* audio_packet_q, AVPacketQueue* video_packet_q);
	~DemuxThread();
	int Init(const string& url);
	int Start();
	int Stop();
	void Run();
	AVCodecParameters* AudioCodecParameters();
	AVCodecParameters* VideoCodecParameters();
	AVRational AudioStreamTimebase();
	AVRational VideoStreamTimebase();
private:
	string url;
	AVFormatContext* ifmt_ctx = nullptr;
	AVPacketQueue* audio_packet_q = nullptr;
	AVPacketQueue* video_packet_q = nullptr;
	int audio_index = -1;
	int video_index = -1;
};

#endif

OK,有了总体的认识,我们先从私有成员讲起,然后再讲公有成员。

私有成员

首先有一个字符串的 url,可以用在未来的输入地址上。然后有 AVFormatContext,这是 ffmpeg 中自带的结构体,是格式上下文,这里不深究,有兴趣的可以看看雷霄骅的博客,在他的博客中有比较深入的探讨。

然后有两个 AVPacketQueue 的成员变量,这个结构体是我们自定义的,未来会讲到。这两个分别存储音频(audio)的数据包(Packet)和视频(video)的数据包。接着有两个 int 变量,表示相关的包在流中的位置,audio_index 就是流中音频包的位置,video_index 就是流中视频包的位置。

公有成员

我们看到公有变量全都是函数,有构造函数,析构函数,其他函数。

我们首先讲构造函数,这比较好理解,就是两个 AVPacketQueue 的初始化。

DemuxThread::DemuxThread(AVPacketQueue* audio_packet_q, AVPacketQueue* video_packet_q) {
	this->audio_packet_q = audio_packet_q;
	this->video_packet_q = video_packet_q;
}

然后我们看看 Start 和 Stop 函数,分别是开始与结束的函数。

int DemuxThread::Start() {
	mythread = new thread(&Run, this);
	if (!mythread) {
		perror("demuxthread: new a thread failed");
		return -1;
	}
	return 0;
}
int DemuxThread::Stop() {
	Thread::Stop();
	avformat_close_input(&ifmt_ctx);
	return 0;
}

在 Start 函数中,我们 new 了一个 thread 线程,如果创建变量失败,则打印错误信息,这里也比较好理解。

在Stop 函数中,我们就用了继承自 Thread 父类的 Stop 方法,功能是销毁线程变量,感兴趣的可以看一下上文基于FFmpeg和SDL的音视频播放器解析(二)。接着我们使用了 avformat_close_input 这个 ffmpeg 自带的函数,显然这是用来关闭输入文件的函数,输入的参数就是 AVFormatContext。

好了,剩下没解析的六个函数 Init,Run,AudioCodecParameters,VideoCodecParameters,AudioStreamTimebase,VideoStreamTimebase,我们将会在下一篇文章中解析,会相对复杂一点,不过有了今天这篇文章的基础,相信大家也会更加容易理解。

欲知后事如何,请听下回分解。文章来源地址https://www.toymoban.com/news/detail-753712.html

到了这里,关于音视频项目—基于FFmpeg和SDL的音视频播放器解析(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 FFmpeg 的跨平台视频播放器简明教程(五):使用 SDL 播放视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月12日
    浏览(45)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月13日
    浏览(34)
  • Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

    Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilter

    2024年02月02日
    浏览(48)
  • FFMpeg-3、基于QT实现音视频播放显示

    1、音视频播放的基础知识 内容来自雷神博客 1、在Windows平台下的视频播放技术主要有以下三种:GDI,Direct3D和OpenGL;音频播放技术主要是DirectSound。 SDL本身并不具有播放显示的功能,它只是封装了底层播放显示的代码 记录三种视频显示技术:GDI,Direct3D,OpenGL。其中Direct3D包

    2024年02月03日
    浏览(47)
  • QtAV:基于Qt和FFmpeg的跨平台高性能音视频播放框架

    目录 一.简介 1.特性 2.支持的平台 3.简单易用的接口 二.编译 1.下载依赖包 2.开始编译 2.1克隆 2.2修改配置文件 2.3编译 三.试用 官网地址:http://www.qtav.org/ Github地址:https://github.com/wang-bin/QtAV ●支持大部分播放功能 ●播放、暂停、播放速度、快进快退、字幕、音量、声道、音

    2024年01月22日
    浏览(50)
  • ffplay播放器剖析(6)----音视频同步分析

    视频和音频是不同的线程,并且也不会同时解出同一个pts的音视频帧,因此需要音视频同步; 以音频为基准 视频慢了则丢掉部分视频帧(视觉感受就是掉帧) 视频快了就继续渲染上一帧 以视频为基准 音频慢了则加速播放(或者丢帧,丢帧会断音,体验感特别差) 音频快了就放慢数据点

    2024年02月15日
    浏览(57)
  • ffplay播放器剖析(7)----音视频暂停模块分析

    1.通过SDL触发事件调用toggle_pause 2.toggle_pause调用stream_toggle_pause 3.stream_toggle_pause修改暂停变量 这个函数可以知道,如果当前状态是暂停的话,那么就会进入if函数 看一下if函数流程,首先我们知道我们 is-frame_timer += av_gettime_relative() / 1000000.0 - is-vidclk.last_updated; 这个就是在之前的基

    2024年02月16日
    浏览(33)
  • Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)

    本功能最初也是有一些人提过类似的需求,就是能不能将本地的音视频文件,通过纯Qt程序推流出去,然后用户可以直接在网页上播放,也可以用各种播放器播放,然后还可以任意切换播放进度,其实说白了就是个文件服务器,用户通过网络地址访问以后,告诉对方当前是媒

    2024年02月01日
    浏览(53)
  • 【MediaPlayerSource】播放器源内部的音视频sender的创建和使用

    来看下声网播放中的sender相关组件设计: MediaPlayerSourceDummy 是一个MediaPlayerSourceImpl ,输入音视频帧到 播放器。

    2024年02月03日
    浏览(36)
  • qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包