音视频同步
来源:8-21 一个真正的播放器(二)

慕妹8246037
2023-07-03
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包装了一层?
我听前面音视频同步原理还挺清晰的,同步的代码这几节课怎么感觉有些地方做复杂了呢。
写回答
1回答
-
李超
2023-07-03
音视频同步有三种方式,一是以音频为基准,视频向音频靠拢;二是以视频为基准,音频向视频靠拢;还有一个是以系统时间为基准,音频时间和视频时间向系统时间靠拢。在设计播放器时要兼容这三种方式,你从这个角度仔细思考一下
052023-07-06
相似问题