ffmpeg转码时对编码率和固定码率的处理

一般fps在代码里这样表示 Fps = den/num 如果den = 15,num=1,则fps = 15。 如果帧率固定,pts*fps就表示当前是第几帧

一般fps在代码里这样表示

Fps = den/num

如果den = 15,num=1,则fps = 15。

如果帧率固定,pts*fps 就表示当前是第几帧。

当输入视频流的帧率不固定,如rmvb ,而输出视频流的帧率固定,ffmpeg作如下处理(参考ffmpeg代码版本0.6.1):

1、  记录和输出视频流ost相对应的输入视频流ist,变量为ost->sync_ist。这是在av_transcode函数进行输出流初始化时进行的。代码分别为:

       
  1. if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
  2. ist->st->codec->codec_type == ost->st->codec->codec_type) {
  3. if(best_nb_frames < ist->st->codec_info_nb_frames){
  4. best_nb_frames= ist->st->codec_info_nb_frames;
  5. ost->source_index = j;
  6. found = 1;
  7. }
  8. }
  9. if (!found) {
  10. if(! opt_programid) {
  11. /* try again and reuse existing stream */
  12. for(j=0;j<nb_istreams;j++) {
  13. ist = ist_table[j];
  14. if (   ist->st->codec->codec_type == ost->st->codec->codec_type
  15. && ist->st->discard != AVDISCARD_ALL) {
  16. ost->source_index = j;
  17. found = 1;
  18. }
  19. }
  20. }
  21. ist = ist_table[ost->source_index];
  22. ist->discard = 0;
  23. ost->sync_ist = (nb_stream_maps > 0) ?
  24. ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
  25. stream_maps[n].sync_stream_index] : ist;

2、  记录输出视频流ost的时间戳。输出为固定帧率,故可以简化为记录帧数,变量为ost->sync_opts。

3、  将ost对应的ist的pts转换成固定帧率的帧数形式。代码为

       
  1. sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);

get_sync_ipts计算ost对应的ist的pts,

av_q2d返回enc->time_base.num/ enc->time_base.den,即1/fps.

4、  将sync_ipts和ost->sync_opts进行求差。

       
  1. double vdelta = sync_ipts - ost->sync_opts;

5、  根据vdelta来判断不同的情况。

l  情况一:Vdelta<-1.1,表示当前输入帧的播放时间在当前输出帧的前一帧之前,故舍弃该帧,nb_frames = 0。

l  情况二: (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){

if(vdelta<=-0.6){

nb_frames=0;

}else if(vdelta>0.6)

ost->sync_opts= lrintf(sync_ipts);}

这里video_sync_method==2 和video_sync_method < 0 表示什么意义,不是很清楚。貌似ffmpeg里video_sync_method一直设为-1。AVFMT_VARIABLE_FPS应该是变帧率的意思。这种情况下,vdelta<=0.6,表示位于当前帧之前,也舍弃该帧,nb_frames = 0;vdelta>0.6表示位于当前帧之后,直接把该帧的时间戳作为输出的时间出来输出该帧;0.6<vdelta<=0.6时,不做任何处理,nb_frames 根据默认值为1。

l  情况三:vdelta > 1.1

此时nb_frames = lrintf(vdelta),需要做插帧操作。

Ffmpeg的插帧操作,貌似是把当前输出帧重复输出nb_frames次。

       
  1. AVFrame* old_frame = enc->coded_frame;
  2. enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
  3. pkt.data= (uint8_t *)final_picture;
  4. pkt.size=  sizeof(AVPicture);
  5. pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
  6. pkt.flags |= AV_PKT_FLAG_KEY;
  7. write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
  8. enc->coded_frame = old_frame;

输出的数据在pkt.data里,final_picture即为经过处理的输入Pic。

6、输出视频流的帧率,是从输入视频流的包头数据中获得的。Rmvb的vedio MDPR块里,保存有fps和fps2信息。Ffmpeg取fps作为帧率,fps2丢弃了。Fps2有什么用,还不清楚。介绍rmvb格式的文章里也没有看到过关于fps的任何介绍。

转自:  http://www.rosoo.net/a/201107/14663.html

ffmpeg转码时对变帧率和固定帧率的处理相关推荐

  1. 关于FFmpeg对手机里拍摄的视频进行转码时角度问题的处理

    手机在拍摄视频时,会记录下手机拍摄时的角度,这个角度会保存到视频文件里,使用ffprobe查看时,会看到rotate值,这值代表将手机顺时针旋转了rotate度进行拍摄的,下面是手机角度示意图(拍摄时 ...

  2. php音视频同步,FFMPEG转码音视频不同步情况总结

    [导读]使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同步,下面我们就来根据问题出现的原因,对所遇到的音视频不同步做一个分类. 使用FFMPEG转码一年半的时间,遇到了各种情况的音视频不同 ...

  3. ffmpeg转码速度控制方法

    FROM:http://blog.chinaunix.net/uid-11344913-id-4082625.html FFMPEG 像读取直播流一样读取文件 HLS当前吵得这么熙熙攘攘的,不知道大伙 ...

  4. ffmpeg转码器移植VC的工程:ffmpeg for MFC

    本文介绍一个自己做的FFMPEG移植到VC下的开源工程:ffmpeg for MFC.本工程将ffmpeg工程中的ffmpeg转码器(ffmpeg.c)移植到了VC环境下.并且使用MFC做了一套简单的 ...

  5. FFmpeg学习之八(FFmpeg源码编译)

    FFmpeg学习之八(FFmpeg源码编译) Mac下 FFmpeg源码编译 安装 1. 使用终端安装FFmpeg 2. 手动编译 2.1 编译环境 - Xcode 2.2 安装依赖库 2.3 安装F ...

  6. ffmpeg源码简析(十二)FFMPEG中的主要结构体总结

    FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a) 解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用 ...

  7. 利用FFmpeg转码生成MP4文件

    利用FFmpeg转码生成MP4文件 2017年06月24日 14:42:53 阅读数:2401 项目中,需要把一路音频流及一路视频流分别转码,生成指定格式(MP4)文件.在使用ffmpeg转码生成mp ...

  8. FFmpeg源码分析:avformat_find_stream_info分析码流信息

    FFmpeg在调用avformat_open_input()之后,可能码流信息不够完整,可以使用avformat_find_stream_info()获取更多的码流信息.比如获取视频帧率.视频宽高,重 ...

  9. 音频参数与FFMpeg转码音频

    一.音频的本质 音频就是一段连续的波. 在AU里查看一首音乐,就是这样的界面. 主界面上分成了两个部分,分别是左右声道: 绿色条的高度就是声音的强度,可以理解为音量大小,最大为0dB. 把波形放大查看 ...

最新文章

  1. pythonsys模块介绍_sys 模块介绍 - Clarkhedi的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. el-image中src加载assets路径下图片使用require避免加载不到
  3. apache pdfbox_Apache PDFBox 2
  4. opencv连续读图
  5. Java-顺序表和链表
  6. 垂直梯形校正画质损失多少_全面了解投影梯形校正,切不可滥用!
  7. AFNetWork 学习资源....
  8. VC中使用GetModuleFileName获取应用程序路径
  9. AJAX通过HTML请求C#一般处理程序
  10. 2022年整理LeetCode最新刷题攻略分享(附中文详细题解)
  11. 【C语言】浅谈C语言数组%c%s打印逻辑及数组打印单个汉字
  12. HBase Coprocessor实现HBase二级索引
  13. java得到日期相减的天数_java得到日期相减的天数
  14. RSSHub 的衍生项目 RSSHub Rader 安装构建 问题 Error: Cannot find module 'node-sass'
  15. SLAM领域的优秀作者与实验室汇总
  16. aws beanstalk mysql_AWS CloudFormation与BeanStalk的联系与区别
  17. (转)ENVI端元提取(MNF→PPI→n-D Visualizer)
  18. 国外计算机科学英语演讲,华工学子英语演讲共庆祖国华诞
  19. 未对文件 C:\Users\Administrator\Documents\WindowsPowerShell\profile.ps1 进行数字签名。无法在当前系统上运行该脚本。
  20. 两车相撞的力怎么计算_两车正面碰撞事故车辆行驶速度计算方法

热门文章

  1. 阿里云备案审核一般多久能过?域名备案需要几天?
  2. 数字电路设计之Leon系列处理器结构
  3. Latex中输入大小写罗马数字
  4. 鸿蒙系统学习 框架概述(一)
  5. 常见的网络接口解释(E1、FE、GE、10GE、POTS)
  6. POE电源模块详解及设计参考-MQ7801/MQ7802
  7. ZLib 解压缩工具
  8. 基于微信小程序+SSM学生社团管理系统设计
  9. AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton
  10. android 查询快捷方式,Android编程添加快捷方式(Short)到手机桌面的方法(含添加,删除及查询)...