資源簡介
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軟件包
評論
共有 條評論