关于音视频同步

hjl0508 2014-12-30 11:24:52
我现在在用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);
}
}
...全文
189 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgw860714 2015-01-13
  • 打赏
  • 举报
回复
引用 3 楼 hjl0508 的回复:
[quote=引用 2 楼 spirit008 的回复:] 计算间隔的时候,需要将每次显示等的耗损时间也算进去比较精确
我知道如何控制视频的播放速度,可是音频的播放速度怎么控制呢?当音频播放快了或者慢了该怎么控制呢?[/quote] 音频正常播就行,只需要修改视频播放的速度就行 音频时间戳(pts)大于视频,则视频丢包,追上音频的速度 音频时间戳(pts)小于视频,视频sleep一会儿再注入数据
hjl0508 2015-01-12
  • 打赏
  • 举报
回复
引用 2 楼 spirit008 的回复:
计算间隔的时候,需要将每次显示等的耗损时间也算进去比较精确
我知道如何控制视频的播放速度,可是音频的播放速度怎么控制呢?当音频播放快了或者慢了该怎么控制呢?
木头菇 2015-01-10
  • 打赏
  • 举报
回复
计算间隔的时候,需要将每次显示等的耗损时间也算进去比较精确
木头菇 2015-01-10
  • 打赏
  • 举报
回复
按时间戳同步。都朝同一个时间基准同步巨可以了,比如按第一个视频帧的时间戳来同步。 如播放第二帧视频时,时间戳差40ms,那么就把音频的差40ms以内的都送播放就行了。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧