Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2259044
  • 博文数量: 862
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10598
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(862)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2011-11-28 16:14:37

output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题。 

阅读前希望大家先了解一下时间戳的概念。 

/* compute current audio and video time */
if (pOutputVars->pOutAudio_st)//存在音频流
 pOutputVars->audio_pts = (double)pOutputVars->pOutAudio_st->pts.val * pOutputVars->pOutAudio_st->time_base.num / pOutputVars- >pOutAudio_st->time_base.den; //(pts是时间戳结构)输出音频的时间戳, 转换为基准时间
else
 pOutputVars->audio_pts = 0.0;
if (pOutputVars->pOutVideo_st)
 pOutputVars->video_pts = (double)pOutputVars->pOutVideo_st->pts.val * pOutputVars->pOutVideo_st->time_base.num / pOutputVars- >pOutVideo_st->time_base.den;//输出视频时间戳
else
 pOutputVars->video_pts = 0.0;
if (!pOutputVars->pOutAudio_st && !pOutputVars->pOutVideo_st)
 return 0;
/* write interleaved audio and video frames */
if (!pOutputVars->pOutVideo_st || (pOutputVars->pOutVideo_st && pOutputVars->pOutAudio_st && pOutputVars->audio_pts < 
 pOutputVars->video_pts)) {
 write_audio_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutAudio_st, pInputAudioBuf);//没有视频流,或者音频流时间没赶上视频流
(通过比较时间戳), 则输出(编码输出)音频祯数据
 } else {
 write_video_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutVideo_st, pInputVedioFrame);//否则输出视频祯数据
}
输出数据的时间戳怎么得到的, 以音频为例:
  pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, pInputAudioBuf);//源数据应该包含时间戳, pInputAudio是源文
件解码后的音频数据
  pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);//编码后的祯也含有源文件的时间戳,这个函数应该是转换同时
间基准,没研究过
  pkt.flags |= PKT_FLAG_KEY;
  pkt.stream_index= st->index;
  pkt.data= audio_outbuf;
...
应该就是这么个过程了,然后用av_write_frame(oc, &pkt), 把音频祯和视频祯交错写入到输出文件. 通过上面分析,可以看到,有时候可能连续写几个音频
祯或视频祯. 
播放时的同步可能ffplay中有,还没细看
有关该问题的讨论帖可参考ffmpeg工程组论坛中的相关讨论: 
阅读(1932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~