资源简介
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 FSpla
文件 2518 2016-09-22 18:22 FSpla
文件 2857 2016-09-22 18:22 FSpla
目录 0 2018-10-30 16:30 FSpla
文件 1042944 2018-03-02 00:36 FSpla
文件 24673280 2017-09-21 18:26 FSpla
文件 2011648 2017-09-21 18:26 FSpla
文件 4432384 2017-09-21 18:26 FSpla
文件 6275584 2017-09-21 18:26 FSpla
文件 693248 2017-09-21 18:26 FSpla
文件 116224 2017-09-21 18:26 FSpla
文件 293888 2017-09-21 18:26 FSpla
文件 504320 2017-09-21 18:26 FSpla
目录 0 2018-10-30 16:29 FSpla
文件 4540 2016-09-22 18:22 FSpla
文件 1025 2016-09-22 18:22 FSpla
目录 0 2018-10-30 16:30 FSpla
文件 1441 2018-10-30 16:30 FSpla
文件 96 2018-10-30 16:30 FSpla
目录 0 2018-10-30 16:30 FSpla
文件 4913 2018-10-30 16:26 FSpla
文件 2009 2016-09-22 18:22 FSpla
文件 935 2016-09-22 18:22 FSpla
文件 377 2016-09-22 18:22 FSpla
文件 2804 2016-09-22 18:22 FSpla
文件 394 2016-09-22 18:22 FSpla
文件 1051 2016-09-22 18:22 FSpla
文件 396 2016-09-22 18:22 FSpla
文件 2855 2016-09-22 18:22 FSpla
文件 920 2016-09-22 18:22 FSpla
文件 2718 2016-09-22 18:22 FSpla
............此处省略243个文件信息
- 上一篇:html课设(个人博客网站)
- 下一篇:ffmpeg软件包
评论
共有 条评论