音视频入门基础:WAV专题(8)——FFmpeg源码中盘算WAV音频文件AVStream的t ...

打印 上一主题 下一主题

主题 1052|帖子 1052|积分 3156

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、引言

本文讲解FFmpeg源码对WAV音频文件进行解复用(解封装)时,其AVStream的time_base是怎样被盘算出来的。



二、FFmpeg源码中盘算WAV音频文件AVStream的time_base的实现

从《音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现》中可以知道,FFmpeg对WAV音频文件进行解复用(解封装)时,其源码内部会调用wav_read_header函数解码WAV音频文件的WAV Header。而该函数内部会调用wav_parse_fmt_tag函数解析“Format chunk”子区块:
  1. for (;;) {
  2.   //...
  3.         switch (tag) {
  4.         case MKTAG('f', 'm', 't', ' '):
  5.         /* only parse the first 'fmt ' tag found */
  6.         if (!got_xma2 && !got_fmt && (ret = wav_parse_fmt_tag(s, size, st)) < 0) {
  7.             return ret;
  8.         } else if (got_fmt)
  9.             av_log(s, AV_LOG_WARNING, "found more than one 'fmt ' tag\n");
  10.         got_fmt = 1;
  11.         break;
  12.         }
  13.         }
  14. }
复制代码


wav_parse_fmt_tag函数内部会调用avpriv_set_pts_info函数设置AVStream的time_base。关于avpriv_set_pts_info函数的用法可以参考:《FFmpeg源码:avpriv_set_pts_info函数分析》。可以看到,调用avpriv_set_pts_info函数后,st->time_base.num会被设置为1,st->time_base.den会被设置为st->codecpar->sample_rate。也就是说WAV音频文件AVStream的time_base为音频采样频率的倒数:
  1. static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream *st)
  2. {
  3.     AVIOContext *pb = s->pb;
  4.     WAVDemuxContext *wav = s->priv_data;
  5.     int ret;
  6.     /* parse fmt header */
  7.     ret = ff_get_wav_header(s, pb, st->codecpar, size, wav->rifx);
  8.     if (ret < 0)
  9.         return ret;
  10.     handle_stream_probing(st);
  11.     ffstream(st)->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  12.     avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
  13.     return 0;
  14. }
复制代码



三、总结

WAV音频文件AVStream的time_base为音频采样频率的倒数。比如音频采样频率为44100Hz,其AVStream的time_base为1/44100(44100分之一)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表