请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

音视频同步

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包装了一层?

我听前面音视频同步原理还挺清晰的,同步的代码这几节课怎么感觉有些地方做复杂了呢。

正在回答 回答被采纳积分+3

1回答

李超 2023-07-03 22:00:39

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕妹8246037 #1
    三种同步方案揉到一个一个demo中,读代码确实有些吃力了。
    我在网上看到 以音频为 基准的同步方式,回复不能用富文本,我就直接放链接了https://blog.csdn.net/shulianghan/article/details/104891200 同步逻辑在文章的最底部, 我找了个mp4试了一下,好像没什么问题。 老师有时间的时候可不可以帮我看一下,这篇文章的同步逻辑有问题不。这篇文章用了av_usleep去控制等待时长,而不是老师用的定时器
    回复 有任何疑惑可以回复我~ 2023-07-04 17:27:50
  • 李超 回复 提问者 慕妹8246037 #2
    所有的播放器都是将三者放在一个结构了,其实课程的代码就是从ffmpeg 中的ffplayer 提炼出来的。不要学好播放器,把课程的代码搞清楚是很重要的。其它的播放器实现思路不建议学,因为ffplay 是行业标准
    回复 有任何疑惑可以回复我~ 2023-07-05 15:39:29
  • 提问者 慕妹8246037 回复 李超 #3
    一个视频的播放过程中,应该不会出现这三种方式切换使用吧,比如刚开始是视频同步音频,播放一段时间,流有什么变动, 需要使用音频同步视频的方式???? 对于一个正常的视频(音频流都有),使用视频同步音频这一种方式应该就能处理吧???。
    回复 有任何疑惑可以回复我~ 2023-07-05 17:31:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信