#include "videoplayer.h"
#include <stdio.h>
#include <QDebug>
#include <QTimer>
#include <qeventloop.h>
#define FLUSH_DATA "FLUSH"
#define SDL_AUDIO_BUFFER_SIZE 1024
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
/********************************************************
Function: packet_queue_init
Description: 队列初始化
Input: *q
OutPut: *q
Return:
Others:
Author:
Date:
*********************************************************/
void packet_queue_init(PacketQueue *q)
{
memset(q, 0, sizeof(PacketQueue));
/**Create a mutex, initialized unlocked.**/
q->mutex = SDL_CreateMutex();
/**Create a condition variable.**/
q->cond = SDL_CreateCond();
q->size = 0;
q->nb_packets = 0;
q->first_pkt = NULL;
q->last_pkt = NULL;
}
/********************************************************
Function: packet_queue_put
Description: 数据压入队列
Input: *pkt
OutPut: *q
Return:
Others:
Author:
Date:
*********************************************************/
int packet_queue_put(PacketQueue *q, AVPacket *pkt) {
AVPacketList *pkt1;
if (av_dup_packet(pkt) < 0) {
return -1;
}
pkt1 = (AVPacketList*)av_malloc(sizeof(AVPacketList));
if (!pkt1)
{
return -1;
}
pkt1->pkt = *pkt;
pkt1->next = NULL;
SDL_LockMutex(q->mutex);
if (!q->last_pkt)
{
q->first_pkt = pkt1;
}
else
{
q->last_pkt->next = pkt1;
}
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size;
SDL_CondSignal(q->cond);
SDL_UnlockMutex(q->mutex);
return 0;
}
/********************************************************
Function: packet_queue_get
Description: 数据出队列
Input: *pkt,block
OutPut: *q
Return:
Others:
Author:
Date:
*********************************************************/
static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block) {
AVPacketList *pkt1;
int ret = 0;
SDL_LockMutex(q->mutex);
for (;;)
{
pkt1 = q->first_pkt;
if (pkt1)
{
q->first_pkt = pkt1->next;
if (!q->first_pkt)
{
q->last_pkt = NULL;
}
q->nb_packets--;
q->size -= pkt1->pkt.size;
*pkt = pkt1->pkt;
av_free(pkt1);
ret = 1;
break;
}
else if (!block)
{
ret = 0;
break;
}
else
{
SDL_CondWait(q->cond, q->mutex);
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}
/********************************************************
Function: packet_queue_flush
Description: 清空队列
Input: *q
OutPut: *q
Return:
Others:
Author:
Date:
*********************************************************/
static void packet_queue_flush(PacketQueue *q)
{
AVPacketList *pkt, *pkt1;
SDL_LockMutex(q->mutex);
for(pkt = q->first_pkt; pkt != NULL; pkt = pkt1)
{
pkt1 = pkt->next;
if(pkt1->pkt.data != (uint8_t *)"FLUSH")
{
/**do nothing ?**/
}
av_free_packet(&pkt->pkt);
av_freep(&pkt);
}
q->last_pkt = NULL;
q->first_pkt = NULL;
q->nb_packets = 0;
q->size = 0;
SDL_UnlockMutex(q->mutex);
}
/********************************************************
Function: audio_decode_frame
Description: 音频解码函数
Input: m_pstVideosState
OutPut: pts_ptr
Return:
Others:
Author:
Date:
*********************************************************/
static int audio_decode_frame(VideoState *m_pstVideosState, double *pts_ptr)
{
int n;
int len1;
int len2;
int decoded_data_size;
int got_frame = 0;
int wanted_nb_samples;
int resampled_data_size;
double pts;
int64_t dec_channel_layout;
AVPacket *pkt = &m_pstVideosState->audio_pkt;
for (;;)
{
while (m_pstVideosState->audio_pkt_size > 0)
{
/**判断暂停**/
if (m_pstVideosState->isPause == true)
{
SDL_Delay(10);
continue;
}
/**为audio_frame分配空间**/
if (!m_pstVideosState->audio_frame)
{
if (!(m_pstVideosState->audio_frame = av_frame_alloc()))
{
return AVERROR(ENOMEM);
}
}
else
{
/**Unreference all the buffers referenced by frame and reset the frame fields.**/
//取消引用帧引用的所有缓冲区并重置帧字段。
av_frame_unref(m_pstVideosState->audio_frame);
}
/**Decode the audio frame of size pkt->size from pkt->data into audio_frame.**/
//将大小为pkt->size from pkt->data的音频帧解码为音频帧。
len1 = avcodec_decode_audio4(m_pstVideosState->audio_st->codec, m_pstVideosState->audio_frame,
&got_frame, pkt);
/**解码失败**/
if (len1 < 0)
{
/**error, skip the frame**/
m_pstVideosState->audio_pkt_size = 0;
break;
}
m_pstVideosState->audio_pkt_data += len1; /**??**/
m_pstVideosState->audio_pkt_size -= len1; /**??**/
/**获取帧失败**/
if (!got_frame)
{
continue;
}
/**计算解码出来的桢需要的缓冲大小**/
decoded_data_size = av_samples_get_buffer_size(NULL,
m_pstVideosState->audio_frame->channels, m_pstVideosState->audio_frame->nb_samples,
(AVSampleFormat)m_pstVideosState->audio_frame->format, 1);
/**Channel layout of the audio data**/
dec_channel_layout =
(m_pstVideosState->audio_frame->channel_layout
&& m_pstVideosState->audio_frame->channels
== av_get_channel_layout_nb_channels(
m_pstVideosState->audio_frame->channel_layout)) ?
m_pstVideosState->audio_frame->channel_layout :
av_get_default_channel_layout(
m_pstVideosState->audio_frame->channels);
/**number of audio samples (per channel) described by this frame**/
//此帧描述的音频采样数(每个通道)
wanted_nb_samples = m_pstVideosState->audio_frame->nb_samples;
if (m_pstVideosState->audio_frame->format != m_pstVideosState->audio_src_fmt
|| dec_channel_layout != m_pstVideosState->audio_src_channel_layout
|| m_pstVideosState->audio_frame->sample_rate != m_pstVideosState->audio_src_freq
|| (wanted_nb_samples != m_pstVideosState->audio_frame->nb_samples
&& !m_pstVideosState->swr_ctx))
{
if (m_pstVideosState->swr_ctx)
{
swr_free(&m_pstVideosState->swr_ctx);
}
/**Allocate SwrContext if needed and set/reset common parameters**/
m_pstVideosState->swr_ctx = swr_alloc_set_opts(NULL,
m_pstVideosState->audio_tgt_channel_layout, (AVSampleFormat)m_pstVideosState->audio_tgt_fmt,
m_pstVideosState->audio_tgt_freq, dec_channel_layout,
(AVSampleFormat)m_pstVideosState->audio_frame->format, m_pstVideosState->audio_frame->sample_rate,
0, NULL);
if (!m_pstVideosState->swr_ctx || swr_init(m_pstVideosState->swr_ctx) < 0)
{
//fprintf(stderr,"swr_init() failed\n");
break;
}
m_pstVide
没有合适的资源?快使用搜索试试~ 我知道了~
qt基于FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器
共287个文件
h:213个
lib:11个
dll:9个
4星 · 超过85%的资源 需积分: 48 138 下载量 54 浏览量
2020-09-08
11:04:40
上传
评论 10
收藏 42.85MB RAR 举报
温馨提示
qt使用FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器,FFmPeg+SDL2.0解码音视频,视频图像解码为YUV420的格式,然后使用QOpenGLWidget进行显示。亲测在windows和Linux下都可使用,附带FFmPeg+SDL2.0第三方库
资源推荐
资源详情
资源评论
收起资源包目录
qt基于FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器 (287个子文件)
libavcodec.so.58.35.100 11.39MB
libavformat.so.58.20.100 2.32MB
libswscale.so.5.3.100 482KB
libavutil.so.56.22.100 403KB
libswresample.so.3.3.100 86KB
libavdevice.so.58.5.100 73KB
libavfilter.so.7.40.101 2.51MB
libswresample.so.3 86KB
libswscale.so.5 482KB
libavutil.so.56 403KB
libavcodec.so.58 11.39MB
libavformat.so.58 2.32MB
libavdevice.so.58 73KB
libavfilter.so.7 2.51MB
libavcodec.dll.a 982KB
libavdevice.dll.a 457KB
libavutil.dll.a 340KB
libavformat.dll.a 134KB
libavfilter.dll.a 45KB
libswscale.dll.a 22KB
libswresample.dll.a 15KB
libpostproc.dll.a 7KB
SDL_config.h.cmake 18KB
videoplayer.cpp 44KB
glyuvwidget.cpp 15KB
widget.cpp 7KB
globaldata.cpp 262B
main.cpp 214B
avutil-56.def 12KB
avcodec-58.def 6KB
avformat-58.def 4KB
avfilter-7.def 2KB
swscale-5.def 756B
avdevice-58.def 544B
swresample-3.def 473B
postproc-55.def 223B
avcodec-58.dll 47.85MB
avformat-58.dll 10.68MB
avfilter-7.dll 10.52MB
avdevice-58.dll 2.63MB
SDL2.dll 1.4MB
avutil-56.dll 856KB
swscale-5.dll 558KB
swresample-3.dll 425KB
postproc-55.dll 132KB
ffmpeg.exe 349KB
ffprobe.exe 184KB
ffplay.exe 153KB
ffmpeg 245KB
ffplay 125KB
ffprobe 140KB
SDL_opengl_glext.h 714KB
avcodec.h 207KB
avformat.h 115KB
SDL_opengles2_gl2ext.h 96KB
SDL_opengl.h 81KB
SDL_egl.h 72KB
SDL_hints.h 56KB
SDL_video.h 45KB
SDL_render.h 44KB
avfilter.h 41KB
SDL_haptic.h 38KB
opt.h 35KB
SDL_audio.h 35KB
pixfmt.h 33KB
SDL_opengles2_gl2.h 31KB
avio.h 31KB
SDL_events.h 30KB
frame.h 29KB
mem.h 23KB
packet.h 23KB
hwcontext.h 22KB
SDL_stdinc.h 22KB
swresample.h 21KB
SDL_surface.h 20KB
intreadwrite.h 18KB
avdevice.h 17KB
SDL_pixels.h 17KB
common.h 16KB
codec.h 16KB
pixdesc.h 16KB
SDL_keycode.h 15KB
SDL_scancode.h 15KB
codec_id.h 15KB
SDL_gamecontroller.h 14KB
SDL_joystick.h 14KB
avstring.h 14KB
SDL_thread.h 13KB
SDL_test_fuzzer.h 13KB
hdr_dynamic_metadata.h 12KB
swscale.h 12KB
imgutils.h 11KB
log.h 11KB
SDL_assert.h 11KB
bsf.h 11KB
SDL_mouse.h 11KB
SDL_atomic.h 11KB
SDL_vulkan.h 11KB
buffer.h 10KB
SDL_system.h 10KB
共 287 条
- 1
- 2
- 3
资源评论
- Zpy181221908232023-06-02编译不过
- 橋竹2022-08-15编译不过。
- 草上爬2021-01-05这种做这方面的开发,有参考价值,谢谢分享
鸿雁高飞jj
- 粉丝: 5
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功