资源简介
Windows环境下使用Ffmpeg+Qt Creator开发的简单播放器:
(1)声音输出使用PortAudio;
(2)视频显示使用SDL2;
(3)具备音视频同步;
(4)使用QT开发,便于Debug运行查看Ffmpeg各个结构体的变量是如何变化。
代码片段和文件信息
#include
#include
#include “audio.h“
#include “avpackets_queue.h“
#include “av_clock.h“
#include “video.h“
#include “log.h“
#define AVCODE_MAX_AUDIO_frame_SIZE 192000 /* 1 second of 48khz 32bit audio */
const double kPortAudioLatency = 0.3; // 0.3秒,也就是说PortAudio库需要累积0.3秒的数据后才真正播放
#define ERR_STREAM stderr
typedef struct audio_param
{
AVframe wantframe; // 指定PCM输出格式
PaStreamParameters *outputParameters;
PaStream *stream;
int sampleRate;
int format;
PacketQueue audioQueue; // 音频队列
int packetEof; // 数据包已经读取到最后
int quit; // 是否退出线程
double audiobaseTime; // 音频base time
SwrContext *swrCtx; // 音频PCM格式转换
}T_AudioParam;
static T_AudioParam sAudioParam;
static int _AudioDecodeframe( AVCodecContext *pAudioCodecCtx uint8_t *audioBuf int bufSize int *packeEof);
void AudioDecodeThread( void *userdata )
{
FunEntry();
AVCodecContext *pAudioCodecCtx = (AVCodecContext *) userdata;
int len1 = 0;
int audio_size = 0;
uint8_t audioBuf[AVCODE_MAX_AUDIO_frame_SIZE];
AVClockDisable(); // 禁止时钟
while ( sAudioParam.quit != 1 )
{
if(sAudioParam.packetEof && sAudioParam.audioQueue.size == 0)
{
sAudioParam.quit = 1;
}
audio_size = 0;
if(VideoGetFirstframe()) // 等图像出来后再出声音
{
audio_size = _AudioDecodeframe( pAudioCodecCtx audioBuf sizeof(audioBuf) &sAudioParam.packetEof);
}
if ( audio_size > 0 )
{
AudioPlay(audioBuf audio_size 0);
}
else
{
std::this_thread::sleep_for(std::chrono::milliseconds(20)); // 没有数据时先休眠20毫秒
}
}
FunExit();
}
// 对于音频来说,一个packet里面,可能含有多帧(frame)数据
/**
* @brief _AudioDecodeframe
* @param pAudioCodecCtx
* @param audioBuf
* @param bufSize
* @param packeEof
* @return
*/
int _AudioDecodeframe( AVCodecContext *pAudioCodecCtx
uint8_t *audioBuf int bufSize int *packeEof)
{
AVPacket packet;
AVframe *pframe = NULL;
int gotframe = 0;
int decodeLen = 0;
long audioBufIndex = 0;
int convertLength = 0;
int convertAll = 0;
if ( PacketQueueTake( &sAudioParam.audioQueue &packet 1 ) < 0 )
{
std::this_thread::sleep_for(std::chrono::milliseconds(30)); // 没有取到数据休眠
return(-1);
}
pframe = av_frame_alloc();
*packeEof = packet.size ? 0: 1; // 约定使用数据长度为0时来标记packet已经读取完毕
while ( packet.size > 0 )
{
/*
* pAudioCodecCtx:解码器信息
* pframe:输出,存数据到frame
* gotframe:输出。0代表有frame取了,不意味发生了错误。
* packet:输入,取数据解码。
*/
decodeLen = avcodec_decode_audio4( pAudioCodecCtx pframe &gotframe &packet );
if(decodeLen < 0)
{
LogError(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 814 2018-02-27 18:23 01-simple-pla
文件 1470 2018-03-06 10:09 01-simple-pla
文件 24050 2018-03-06 18:40 01-simple-pla
文件 11046 2018-03-06 17:01 01-simple-pla
文件 465 2018-03-06 16:31 01-simple-pla
文件 1596 2018-03-06 17:01 01-simple-pla
文件 888 2018-03-06 16:31 01-simple-pla
文件 1426 2018-03-06 17:03 01-simple-pla
文件 292 2018-03-06 10:09 01-simple-pla
文件 24510976 2018-02-26 09:14 01-simple-pla
文件 2011648 2018-02-26 09:14 01-simple-pla
文件 4290048 2018-02-26 09:14 01-simple-pla
文件 5145088 2018-02-26 09:14 01-simple-pla
文件 669184 2018-02-26 09:14 01-simple-pla
文件 120334 2017-10-09 11:53 01-simple-pla
文件 1540622 2015-12-29 06:25 01-simple-pla
文件 79360 2015-12-29 06:25 01-simple-pla
文件 667648 2018-02-28 11:56 01-simple-pla
文件 116736 2018-02-26 09:14 01-simple-pla
文件 1005056 2018-02-26 09:14 01-simple-pla
文件 6636853 2018-02-26 09:14 01-simple-pla
文件 293888 2018-02-26 09:14 01-simple-pla
文件 509440 2018-02-26 09:14 01-simple-pla
文件 24510976 2018-02-26 09:14 01-simple-pla
文件 2011648 2018-02-26 09:14 01-simple-pla
文件 4290048 2018-02-26 09:14 01-simple-pla
文件 5145088 2018-02-26 09:14 01-simple-pla
文件 669184 2018-02-26 09:14 01-simple-pla
文件 281600 2018-02-26 09:14 01-simple-pla
文件 1258496 2018-02-26 09:14 01-simple-pla
............此处省略343个文件信息
相关资源
- 使用ffmpeg将多张图片生成H264裸流并获
- ffmpeg h264 转换jpg
- 利用FFmpeg将Jpeg图片转为任意视频容器
- ffmpeg exeWINXP的最后一个可运行版本
- 最简单的基于FFMPEG的视频编码器修正
- ffmpeg-vs2013
- 基于FFMPEG_SDL2_音视频播放_参考音频时
- ffmpeg-3.2-win32-shared.zip
- MyPeppa_Release_V1.0.rar
- ffmpeg录音
- ffmpeg资料全
- ffmpeg_windows屏幕录制并编码成H264
- windows32位系统的ffmpeg
- 利用ffmpeg提取任意格式视频帧关键帧
- ffmpeg3.0源码
- FFmpeg解码+SDL播放
- ffmpeg封装H264成MP4、AVI视频格式,及提
- 从零开始学习音视频编程技术十二 录
- AudioResample
- 最简单的基于FFmpeg的libswscale的教程
- ffmpeg-2.5.2-win32-shared
- Qt 日历可显示阴历生宵和时钟基于Q
- 利用FFmpeg将mkv视频转换为H.264
- 计算机网络打作业实现QQ.zip
- 基于qt实现的简易象棋游戏
- 安卓交叉编译ffmepgx86_64版本
- ffmepg的安卓arm(armeabi-v7a)版本
- 基于ARM9的远程视频监控系统
- 基于QT的音乐播放器源代码及详细教程
- 有关Qt的二十篇中文论文
评论
共有 条评论