资源简介

Windows平台上的音视频同步Demo,原作者博客链接:http://www.cnblogs.com/wangguchangqing/p/5900426.html,下载的工程文件不能编译通过,这个问题新手会很头疼,我修改并重新配置了工程,下载即可编译通过,使用VS2012等IDE打开

资源截图

代码片段和文件信息


#include “Audio.h“

#include 
#include 
extern “C“ {

#include 

}

extern bool quit;

AudioState::AudioState()
:BUFFER_SIZE(192000)
{
audio_ctx = nullptr;
stream_index = -1;
stream = nullptr;
audio_clock = 0;

audio_buff = new uint8_t[BUFFER_SIZE];
audio_buff_size = 0;
audio_buff_index = 0;
}

AudioState::AudioState(AVCodecContext *audioCtx int index)
:BUFFER_SIZE(192000)
{
audio_ctx = audioCtx;
stream_index = index;


audio_buff = new uint8_t[BUFFER_SIZE];
audio_buff_size = 0;
audio_buff_index = 0;
}

AudioState::~AudioState()
{
if (audio_buff)
delete[] audio_buff;
}

bool AudioState::audio_play()
{
SDL_AudioSpec desired;
desired.freq = audio_ctx->sample_rate;
desired.channels = audio_ctx->channels;
desired.format = AUDIO_S16SYS;
desired.samples = 1024;
desired.silence = 0;
desired.userdata = this;
desired.callback = audio_callback;

if (SDL_OpenAudio(&desired nullptr) < 0)
{
return false;
}

SDL_PauseAudio(0); // playing

return true;
}

double AudioState::get_audio_clock()
{
int hw_buf_size = audio_buff_size - audio_buff_index;
int bytes_per_sec = stream->codec->sample_rate * audio_ctx->channels * 2;

double pts = audio_clock - static_cast(hw_buf_size) / bytes_per_sec;


return pts;
}

/**
* 向设备发送audio数据的回调函数
*/
void audio_callback(void* userdata Uint8 *stream int len)
{
AudioState *audio_state = (AudioState*)userdata;

SDL_memset(stream 0 len);

int audio_size = 0;
int len1 = 0;
while (len > 0)// 向设备发送长度为len的数据
{
if (audio_state->audio_buff_index >= audio_state->audio_buff_size) // 缓冲区中无数据
{
// 从packet中解码数据
audio_size = audio_decode_frame(audio_state audio_state->audio_buff sizeof(audio_state->audio_buff));
if (audio_size < 0) // 没有解码到数据或出错,填充0
{
audio_state->audio_buff_size = 0;
memset(audio_state->audio_buff 0 audio_state->audio_buff_size);
}
else
audio_state->audio_buff_size = audio_size;

audio_state->audio_buff_index = 0;
}
len1 = audio_state->audio_buff_size - audio_state->audio_buff_index; // 缓冲区中剩下的数据长度
if (len1 > len) // 向设备发送的数据长度为len
len1 = len;

SDL_MixAudio(stream audio_state->audio_buff + audio_state->audio_buff_index len SDL_MIX_MAXVOLUME);

len -= len1;
stream += len1;
audio_state->audio_buff_index += len1;
}
}

int audio_decode_frame(AudioState *audio_state uint8_t *audio_buf int buf_size)
{
AVframe *frame = av_frame_alloc();
int data_size = 0;
AVPacket pkt;
SwrContext *swr_ctx = nullptr;
static double clock = 0;

if (quit)
return -1;
if (!audio_state->audioq.deQueue(&pkt true))
return -1;

if (pkt.pts != AV_NOPTS_VALUE)
{
audio_state->audio_clock = av_q2d(audio_state->stream->time_base) * pkt.pts;
}
int ret = avcodec_send_packet(audio_state->audio_ctx &pkt);
if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
return -1;

ret = avcodec_receive_frame(audio_state->audio_ctx frame);
if (ret < 0 && ret != AVERROR_EOF)
return 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-10-30 16:30  FSplayer-master\
     文件        2518  2016-09-22 18:22  FSplayer-master\.gitattributes
     文件        2857  2016-09-22 18:22  FSplayer-master\.gitignore
     目录           0  2018-10-30 16:30  FSplayer-master\Debug\
     文件     1042944  2018-03-02 00:36  FSplayer-master\Debug\SDL2.dll
     文件    24673280  2017-09-21 18:26  FSplayer-master\Debug\avcodec-57.dll
     文件     2011648  2017-09-21 18:26  FSplayer-master\Debug\avdevice-57.dll
     文件     4432384  2017-09-21 18:26  FSplayer-master\Debug\avfilter-6.dll
     文件     6275584  2017-09-21 18:26  FSplayer-master\Debug\avformat-57.dll
     文件      693248  2017-09-21 18:26  FSplayer-master\Debug\avutil-55.dll
     文件      116224  2017-09-21 18:26  FSplayer-master\Debug\postproc-54.dll
     文件      293888  2017-09-21 18:26  FSplayer-master\Debug\swresample-2.dll
     文件      504320  2017-09-21 18:26  FSplayer-master\Debug\swscale-4.dll
     目录           0  2018-10-30 16:29  FSplayer-master\FSPlayer\
     文件        4540  2016-09-22 18:22  FSplayer-master\FSPlayer\Audio.cpp
     文件        1025  2016-09-22 18:22  FSplayer-master\FSPlayer\Audio.h
     目录           0  2018-10-30 16:30  FSplayer-master\FSPlayer\Debug\
     文件        1441  2018-10-30 16:30  FSplayer-master\FSPlayer\Debug\FSPlayer.Build.CppClean.log
     文件          96  2018-10-30 16:30  FSplayer-master\FSPlayer\Debug\FSPlayer.log
     目录           0  2018-10-30 16:30  FSplayer-master\FSPlayer\Debug\FSPlayer.tlog\
     文件        4913  2018-10-30 16:26  FSplayer-master\FSPlayer\FSPlayer.vcxproj
     文件        2009  2016-09-22 18:22  FSplayer-master\FSPlayer\FSPlayer.vcxproj.filters
     文件         935  2016-09-22 18:22  FSplayer-master\FSPlayer\frameQueue.cpp
     文件         377  2016-09-22 18:22  FSplayer-master\FSPlayer\frameQueue.h
     文件        2804  2016-09-22 18:22  FSplayer-master\FSPlayer\Media.cpp
     文件         394  2016-09-22 18:22  FSplayer-master\FSPlayer\Media.h
     文件        1051  2016-09-22 18:22  FSplayer-master\FSPlayer\PacketQueue.cpp
     文件         396  2016-09-22 18:22  FSplayer-master\FSPlayer\PacketQueue.h
     文件        2855  2016-09-22 18:22  FSplayer-master\FSPlayer\Video.cpp
     文件         920  2016-09-22 18:22  FSplayer-master\FSPlayer\Video.h
     文件        2718  2016-09-22 18:22  FSplayer-master\FSPlayer\VideoDisplay.cpp
............此处省略243个文件信息

评论

共有 条评论