ffmpeg 播放器原理
1 播放器过程
线程1 : readPackets-------》 audio_packets队列 video packets 队列
线程2: decodeAudio && play
线程3: decodeVideo---》扔到videoFrames队列里, 如果AVFrame乱序则需要排序
线程4: playVideo, 视频时钟和音频时钟比较得到delay ----》 Sleep(delay)-----》play
2. 同步过程(很重要) 时钟 Audio :
get_audio_clock(){
pts = audio_clock - (double)hw_buf_size / bytes_per_sec (没有播放的数据时间) ;
return pts;
} pts = (double)pFrame->reordered_opaque * av_q2d(is->pFormatCtx->streams[is->VideoStream]->time_base) // 单位秒; //更新视频内部时钟 以视频时钟为基准同步才有用
//is->video_clock = pts + av_q2d(is->pVideoCodecCtx->time_base) ; //如果是30帧率, 那么time_base 就等于 0.0333; delay = pts - is->frame_last_pts; //算出大致的延迟时间 diff = pts - get_audio_colock(); delay = diff<-thresh ? diff>thresh ? 1.6*delay : delay //diff太小了 delay就小一点,diff 太大了 delay就大一点
actual_delay = delay + is->frame_timer - av_gettime()/ //算出实际延时 实际延时就等于上一次的 delay -(getTimeLast - getTimeCurr)(程序运行耗时)
Sleep((int)(actual_delay * + 0.5));
3. 音频解码+播放
fill_audio(void *udata,Uint8 *stream,int len){
player->m_AudioPackQueue.packet_queue_get(player->m_TempPack,); //从队列拿包
len1 = avcodec_decode_audio3;//解码
audio_clock = AVPacket ::pts * av_q2d(AVStream::time_base);//音频时钟
memcpy(stream...);//喂给播放器
}
2. 一些变量的含义
2.1 timebase
pFormatCtx->streams[0]->time_base: 1/90000。为什么是90000?因为mpeg的pts、dts都是以90kHz来采样的,所以采样间隔为1/90000秒。
AVPacket下的pts和dts以AVStream->time_base为单位(数值比较大)。这也很容易理解,根据mpeg的协议,压缩后或解压前的数据,pts和dts是90kHz时钟的采样值,时间间隔就是AVStream->time_base。
AVFrame里面的pkt_pts和pkt_dts是拷贝自AVPacket,同样以AVStream->time_base为单位;而pts是为输出(显示)准备的,以AVCodecContex->time_base为单位)。//FIXME
codec/decode层timebase,h264随着帧率变化例如1:25 aac根据采样率变化例如1:44100。
从上面可以看到,InputStream下的pts和dts以AV_TIME_BASE为单位(微秒),至于为什么要转化为微妙,可能是为了避免使用浮点数。
综上: streams AVPacket AVFrame 都是同样的timebase=1/90K codec/decode timebase=1/25 (随帧率变化)
如果要获得当前时钟(秒) seconds = av_q2d(timeBase) * pts;
ffmpeg 播放器原理的更多相关文章
- ffmpeg播放器实现详解 - 视频显示
ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...
- iOS商品详情、ffmpeg播放器、指示器集锦、自定义圆弧菜单、实用工具等源码
iOS精选源码 电商商品详情 Swift.两种方式实现tableViewCell拖拽功能 ffmpeg+openGL播放器 微信聊天表情雨.表情下落.表情动画 iOS指示器集锦 弹窗增加 picker ...
- Win7 VS2017简单编译FFMPEG播放器FFPlay
Win平台简单编译FFPlay播放器,顺便纪念下雷霄骅,一年前刚学FFMPEG时还看过他的博客,昨晚再次搜FFMPEG文章时才知道人已经走了... 做成了视频放到B站 https://www.bili ...
- ffmpeg播放器实现详解 - 框架搭建
ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...
- 基于ffmpeg网络播放器的教程与总结
基于ffmpeg网络播放器的教程与总结 一. 概述 为了解决在线无广告播放youku网上的视频.(youku把每个视频切换成若干个小视频). 视频资源解析可以从www.flvcd. ...
- 视频播放器控制原理:ffmpeg之ffplay播放器源代码分析
版权声明:本文由张坤原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/535574001486630869 来源:腾云阁 ht ...
- 基于ffmpeg的C++播放器1
基于ffmpeg的C++播放器 (1) 2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最 ...
- 仿迅雷播放器教程 -- 基于ffmpeg的C++播放器 (1)
2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最后说会开源一个播放器,没想到快两年了,才 ...
- 零基础读懂视频播放器控制原理——ffplay播放器源代码分析
版权声明:本文由张坤原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/535574001486630869 来源:腾云阁 ht ...
随机推荐
- [转]BigDecimal使用(整理)
原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算.比如:货币 使用 ...
- PostgreSQL中的 时间格式转化常识
下面的SQL文查询结果是 "2018-08-20 10:09:10.815125",并且返回类型可以当String处理.返回json等都方便使用. SQL> SELECT t ...
- Flutter Container容器组件、Text文本组件详解
import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } class MyApp extends Stateles ...
- Python的collections之namedtuple的使用及其优势
类实现: class User: def __init__(self, name, age, height): self.name = name self.age = age self.height ...
- javascript取模运算是怎么算的?其实是取余数
问到是否整除,这里记录下取模 比如120分钟是不是整点?120%60 === 0 为整点 javascript取模运算是一个表达式的值除以另一个表达式的值,并返回余数. 取模在js里就是取余数的意思. ...
- osg::Node clone
深度拷贝 node.clone(osg::CopyOp::DEEP_COPY_ALL) osg::ref_ptr<osg::Node> deepnode = (osg::Node *)( ...
- osg gdal加载tif数据文件
osg加载.tif地形数据文件 #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <iostream> ...
- 基于Python的WEB接口开发与自动化测试 pdf(内含书签)
基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...
- ABAP DEMO 下拉框
效果展示: *&---------------------------------------------------------------------* *& Report YCX ...
- 解决ubuntu的firefox上网速度慢【转】
在ubuntu上用firefox上网十分慢,但是在切换了chrome后发现上网速度很快,是解析域名上出现了问题,所以要为FF设置DNS缓存以提高速度.(在WIN下这个是自动设置好的,在ubuntu下需 ...