关于音视频同步

hjl0508 hjl0508 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我现在在用SDL做一个播放YUV视频和PCM音频的播放器,都是直接播放原始数据,现在分别播放没问题了,只是音视频同步这块我没有什么思路,有没有谁能提供个思路。

第一次做这方面的,目前有点混乱。查资料我感觉视频的时间可以用video_clock+=40(默认25fps)
但是音频这边采样率什么的搞不太懂,我调试查看,当采样率为44100,缓存为1024时,SDL调用回调函数的间隔是20,20,31这样一直循环下去,我不明白的就是每次传入的数据大小都一样为什么会有一个间隔不同呢?

主要是音视频同步的思路,谢谢!

下面是我播放音频的代码

static Uint8 *audio_chunk;
static Uint32 audio_len;
static Uint8 *audio_pos;

void fill_audio(void *udata,Uint8 *stream,int len){
//SDL
long diff=time.elapsed();
qDebug("time is:%ld the len %d",diff,len);
SDL_memset(stream, 0, len);
if(audio_len==0) /* Only play if we have data left */
return;
len=(len>audio_len?audio_len:len); /* Mix as much data as possible */

SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);
audio_pos += len;
audio_len -= len;
}

int main_loop_pcmfile(void *window)
{
SDL_AudioSpec wanted_spec;
wanted_spec.freq = 44100;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.channels = 2;
wanted_spec.silence = 0;
wanted_spec.samples = 1024;
wanted_spec.callback = fill_audio;

if (SDL_OpenAudio(&wanted_spec, NULL)<0){
qDebug("can't open audio");
return -1;
}

FILE *fp=fopen("out.pcm","rb+");
if(fp==NULL){
printf("cannot open this file\n");
return -1;
}

int pcm_buffer_size=4096;
char *pcm_buffer=(char *)malloc(pcm_buffer_size);
int data_count=0;
time.start();
while(1){
if (fread(pcm_buffer, 1, pcm_buffer_size, fp) != pcm_buffer_size){
// Loop
fseek(fp, 0, SEEK_SET);
fread(pcm_buffer, 1, pcm_buffer_size, fp);
data_count=0;
}
audio_len =pcm_buffer_size;
audio_pos = (Uint8 *) pcm_buffer;
//Play
SDL_PauseAudio(0);
while(audio_len>0)//Wait until finish
SDL_Delay(1);
}
}
...全文
评论 4
收藏 已收藏
分享
返回顶部