duration = (frame_rate.num && frame_rate.den ? av_q2d((AVRational){frame_rate.den, frame_rate.num}) : 0);
pts = (video_frame->pts == AV_NOPTS_VALUE) ? NAN : video_frame->pts * av_q2d(tb);
pts = synchronize_video(is, video_frame, pts);
//insert FrameQueue
queue_picture(is, video_frame, pts, duration, video_frame->pkt_pos);
为什么要维护一个video_clock,视频解码之后为什么要synchronize_video?这个时间的同步不该是在从队列取帧播放的时候控制吗,怎么解码之后就要做。
音频播放的过程中,audio_clock在变化,同时不停的从视频队列里取frame,根据所取frame的pts等等信息算出一个播放时间(这个时间不就是实时的video_clock吗),和audio_clock去比较不就行了? 视频慢了就赶紧去队列取下一帧,快了就等待,感觉视频解码之后用不着synchronize_video和维护video_clock啊。
typedef struct Frame {
AVFrame *frame;
double pts; /* presentation timestamp for the frame */
double duration; /* estimated duration of the frame */
int64_t pos; /* byte position of the frame in the input file */
int width;
int height;
int format;
AVRational sar;
} Frame;
这个结构体Frame定义的一些信息不都是AVFrame中的吗,咋不直接用AVFrame,还给AVFrame包装了一层?
我听前面音视频同步原理还挺清晰的,同步的代码这几节课怎么感觉有些地方做复杂了呢。