音视频同步

来源: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

音视频同步有三种方式,一是以音频为基准,视频向音频靠拢;二是以视频为基准,音频向视频靠拢;还有一个是以系统时间为基准,音频时间和视频时间向系统时间靠拢。在设计播放器时要兼容这三种方式,你从这个角度仔细思考一下

0
5
李超
回复
慕妹8246037
每个人的需求不一样,很多同学想了解全部三种算法,课程里讲算法都讲清楚了,如果你只需要一种,你觉得现在的代码复杂,你可以根据自己的理解简化一下。学习的过程就是理解思想,根据例子调试,验证,的过程。如果遇到问题实在解决不了,可以到群里和同学老师讨论。
2023-07-06
共5条回复

经典再升级-FFmpeg5.0核心技术精讲,打造音视频播放器

学好FFmpeg核心技术,做高效,高薪,有竞争力的音视频工程师

2726 学习 · 814 问题

查看课程