本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8

本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。


命令如下:ffmpeg -re -i a.mp4 a.flv

-re 参数控制读取 AVpacket 的速度,按照帧率速度读取文件 AVpacket。如果有多个流,以最慢的帧率为准。


命令行参数 -re 定义如下:

ffmpeg_opt.c 3453行
{ "re",OPT_BOOL | OPT_EXPERT | OPT_OFFSET |  OPT_INPUT,  { .off =  OFFSET(rate_emu) },"read input at native frame rate", "" },

命令行参数 -re 赋值给 InputFile 结构, 如下:

ffmpeg_opt.c 1209行
f->rate_emu   = o->rate_emu;

可以看到,在 ffmpeg_opt.c 1209行 把 OptionsContext 里面的 rate_emu 赋值给了 InputFile 的 rate_emu。

InputFile 的 rate_emu 赋值给 InputStream 的start, 如下:

ffmpeg.c 4134行/* init framerate emulation */for (i = 0; i < nb_input_files; i++) {InputFile *ifile = input_files[i];if (ifile->rate_emu) //注意这里for (j = 0; j < ifile->nb_streams; j++)input_streams[j + ifile->ist_index]->start = av_gettime_relative(); //注意这里}

InputStream 的start 的用途,如下:

fmpeg.c 4134行
static int get_input_packet(InputFile *f, AVPacket *pkt)
{if (f->rate_emu) { //注意这里int i;for (i = 0; i < f->nb_streams; i++) {InputStream *ist = input_streams[f->ist_index + i];int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);int64_t now = av_gettime_relative() - ist->start;if (pts > now)return AVERROR(EAGAIN);}}
​return av_read_frame(f->ctx, pkt);
}

从上面的逻辑可以看到,InputStream 的start 实际上就是存一个启动时间,然后在 get_input_packet() 里面根据 now 跟 ist->dts 控制频率 读取 AVpacket 的数据。

如果有多个流,以最慢的帧率为准。


分析到这里,这也是我之前的《FFmpeg 源码分析》 专栏不断强调的重点,初学者学ffmpeg的源码,不需要一开始就去看多余的分支逻辑,因为 ffmpeg.c 里面实现了非常多的命令参数功能。

如果一开始就把 ffmpeg 的所有参数的结构讲完,没有意义。就好像初学者一开始看 这个 InputStream 的start字段,根本不可能猜出来 start 这个字段的真正用途。我一开始还以为start 是流的第一个帧的pts。

所以,学习ffmpeg源码,只需要学会用 Qt 来断点调试,了解了主干逻辑就行。其他细枝末节的逻辑,你后面用到了,断点调试即可了解ffmpeg是如何实现这些功能的,这样会影响更加深刻。


由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

ffmpeg命令分析-re相关推荐

  1. ffmpeg命令分析【详细分析合集】

    ffmpeg命令分析[内容包括]-vf/ac/b:v/r/re/segment/t/ss/output_ts_offset/vn/acc/print/yuv420p/yuv封装mp4/FFmpeg硬件 ...

  2. ffmpeg命令分析-vn

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s ...

  3. ffmpeg命令分析-segment

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s ...

  4. ffmpeg命令分析-t

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s ...

  5. ffmpeg命令分析-ac

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s . ...

  6. ffmpeg命令分析-pix_fmt

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的.a.mp4下载链接:百度网盘,提取码:nl0s ...

  7. ffmpeg命令分析-r

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 之前的文章分析 FFMpeg 工程的 do_video_out() 函数的时候,建议不关注 delta0,delt ...

  8. ffmpeg命令分析-tee输出多路流

    本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s . 早期 FFmpeg 在 转 码 后 输出 直播 流 时并 不支持 编码 一次 之后 同时 输出 多路 直播 ...

  9. FFMPEG命令汇总

    1.ffmpeg使用语法 命令格式:     ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]     ffmpeg [[options][`-i' input_file ...

最新文章

  1. 你用iPhone打游戏,有人却用iPhone来训练神经网络
  2. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
  3. 后盾网lavarel视频项目---5、淘宝镜像cnpm的原理及如何使用
  4. java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
  5. zookeeper的设计猜想-Follower角色
  6. 创业活动平台,2019路演活动报名网站
  7. 怎么从计算机上删除东西吗,怎么在电脑中删除不想要的软件
  8. java 并发包脑图
  9. android mp3转acc,acc转换mp3工具_Magic AAC to MP3 Converter V3.7 下载
  10. 防御SQL注入的方法总结
  11. 10、JDBC(重点)
  12. 吃冬瓜对宝宝有什么好处?
  13. linux .sh文件详解,sh命令(sh命令详解)
  14. Excel教程 零基础到应用实操
  15. excel 自动换行后批量设置单元格上下边距
  16. 物联网信息安全复习笔记(从头开始,两天速成)
  17. 如何判断两条直线是否相交
  18. 已拦截跨源请求:同源策略禁止读取位于 http:**** 的远程资源。(原因:CORS 头缺少 ‘Access-Control-A
  19. python中时间模块datetime总结
  20. 蚂蚁金服智能推荐引擎解决方案与实践

热门文章

  1. 关于output.topk
  2. AMBA3.0协议——AXI(Advanced eXtensible Interface)总线介绍
  3. IntelliJ IDEA 版本破解教程详解
  4. 坚持UGC 酷6走上网络视频健康化模式
  5. Bundle管理Vim插件
  6. HTML5期末大作业:餐饮饮食网站设计——奶茶(6页) HTML+CSS+JavaScript html大学生网站开发实践作业...
  7. 智能手机行业利润图解:苹果占65%远超其他厂商
  8. 计科专业c语言重修,计算中心
  9. 如何在 Mac 中运行 Office 办公软件?
  10. Android 手写字体识别