音视频采样

视频

编码前,会设置帧率,如1秒25帧, 按90000的时间基,一帧就是3600。

avcodec_encode_video2成功后(如ffmpeg.c中do_video_out),pkt->pts被设置成帧序号,如33帧。

紧接着是av_packet_rescale_ts(&pkt, enc->time_base, ost->st->time_base);这个函数的分析如下:

void av_packet_rescale_ts(AVPacket *pkt,

AVRational src_tb,  //这个是个时间基,就是我们设置的帧率(num=1,den=25)

AVRational dst_tb) //这个是视频的时间基,就是(num=1,den=90000)

{
    if (pkt->pts != AV_NOPTS_VALUE)
        pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb);       //帧序到时间的转换
    if (pkt->dts != AV_NOPTS_VALUE)
        pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb);
    if (pkt->duration > 0)

        pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb);

   ......

}

最终ptk->pts变成了118800,除以3600刚好就是33。

音频

音频帧的DTS/PTS计算:
一个音频帧(对于AAC来说, 是1024个采样点),
相对于音频采样率(如 44100个采样点/second = 44.1KHz)来说,

累加上每帧的增量(1024*1000/44100 = 23.219ms/frame)

1024*1000/48000= 21.333ms/frame

mp3 每帧均为1152个字节, 则:
frame_duration = 1152 * 1000 / sample_rate
例如:sample_rate = 44100HZ时,计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
--------------------- 
作者:hongge372 
来源:CSDN 
原文:https://blog.csdn.net/u010029439/article/details/80808898 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/m0_37346206/article/details/89071735