最新用ffmpeg+x264编码视频,之前使用老版本的ffmpeg编码视频文件没有问题,但是换了最新的版本之后(ffmpeg版本号2.8.2),出现了编码出来的视频帧率特别大的问题。

找了很久,终于解决了,在这里记录一下探索过程。

首先,我设置的视频的帧率是25帧/s,但是编码出来的视频帧率则是几千,如下图所示

可以看到上图的帧率和码率都是非法的值,这个是为什么呢?

下面是解决过程。

首先,先知道这个帧率是存在AVStream里的,也就是AVStream的time_base字段。但是我明明设置的这个字段是25帧每秒,为什么最后编码出来的视频是这个样子呢。

没办法,只好去参看ffmpeg文档,在AVStream的time_base的介绍中有这么一句话。

简单的翻译一下,这句话的意思是在avformat_write_header中,这个混合器(不知道怎么翻译好,简单来说就是把视频流和音频流混合在一起的东西)会重新覆盖这个值,这个覆盖的值和你设置的值是无关的,它依赖这个存储的格式。

恩 这算是给了我一个指示,马上去看avformat_write_header。不幸的事,文档中只有简单的该函数的介绍,并没有说明这个值怎么变化。

没办法了 只有使用最原始的办法了,打开source insight ,查看ffmpeg的源码吧。

可以看见avformat_write_header还是比较简单的,只调用了几个接口,下面的问题就是找到是哪个接口更改了这个值。

这个简单 可以是用最原始的方法 打日志解决。通过打日志可以找到是在write_header中更改了这个值。

这个write_header是你设置的Outputforamt的write_header方法,这里我设置的是mp4,所以muxer就是ff_mp4_muxer,全局搜索这个字段就行了。

可以找到这个muxer的write_header方法是mov_write_header

好了 终于找到根源了,让我们来看一下这个mov_write_header方法吧,

这个函数比较长,我就不全截取下来了,如果你不愿意去看代码的话,找根源还可以使用万能方法(我不会告诉你)

这里直接截取根源的代码

注意看画红框的代码,这里的track->timescale会在下面重新计算AVStream的time_base,也就是这里更改了我设置的值。上面的if判断如果设置了video_track_timescale这个值的话,则他就采用这个值,要是没有设置这个值的话,就采用我们AVStream的time_base的分母,等等,你下面的while循环是什么鬼,如果我设置的分母小于10000.你就一直乘以2,直到它大于10000,怪不得我编码出来的视频都这么奇葩呢。原来是你在搞鬼。

好吧 终于找到根源了。下面就是解决办法了。通过看源码可以知道 如果我们设置了video_track_timescale,他就会采用这个值。恩好,既然这样。那我们在avformat_write_header之前设置上这个值吧‘

AVDictionary* opt = NULL;
    av_dict_set_int(&opt, "video_track_timescale", 25, 0);
    avformat_write_header(m_pFormatCtx, &opt);

恩 重新编码一下试试。结果果然如我所料,这回帧率正常了,码率也正常了。

ps:这个地方之前版本的ffmpeg没有下面的while循环,当然老版本的代码和新版本的代码变化也很大,不知道这个while循环的意义是什么。

小弟也是初学ffmpeg和音视频编码,对很多的基础名词都不知道什么意思(比如上面的video_track_timescale),了解的ffmpeg也是九牛一毛,所以如果有什么问题,还希望大家指正。

ffmpeg+x264编码mp4格式的视频出现视频帧率很大,导致视频无法播放的问题相关推荐

  1. 【Bug修复】yuv生成mp4格式文件帧数(时间)与原视频不一致

    问题描述 需要将一系列的视频从yuv格式的文件编码成每秒30帧的视频,但是在yuv生成mp4格式时,存在帧数不对齐的问题. 1.准备两个视频 Animation_1080P-209f.mkv,25fp ...

  2. ffmpeg + x264 编码H264(x86+arm)

    一.x86-linux 1.  编译x264 我用的是目前最新版:x264-snapshot-20101130-2245.tar.bz2 ./configure --disable-asm mak ...

  3. swf怎么转换成mp4格式,5个方法都很简单

    swf怎么转换成mp4格式?各位小伙伴们有没有遇到过想要打开swf文件却需要安装flash插件的情况呢?其实,swf文件是flash软件或者animate软件导出的flash软件的专属格式,主要应用于 ...

  4. ffmpeg实现将MP4格式转封装成avi格式

    https://blog.csdn.net/IOT_SHUN/article/details/79739366

  5. NVD视频解码器SDK使用、大华视频解码器SDK使用

    最近调用了视频解码器的接口  因为dll是c++编写的 而我在c#中调用  所以有一个结构体中的类型转换一直报错  今天得到高人指点  把问题解决了  发到网上 供有问题的同胞参考(我之前在网上找了很 ...

  6. 如何将OGV格式的视频转换成MP4格式

    在日常生活中,看视频是必定会做的事情,但有时因为无法播放视频,有些可能是视频文件损坏,但一般都是视频格式比较特殊,播放器不支持某种视频格式的编码所以才无法播放.比如非常少见的OGV格式.OGV视频HT ...

  7. qsv格式爱奇艺视频知否如何转换成MP4格式

    最近有一部电视剧很火,说出来大家要都知道,那就是<知否知否应是绿肥红瘦>.这部剧是由赵丽颖.冯绍峰领衔主演,朱一龙.施诗.张佳宁等特别出演的古代社会家庭题材电视剧.说起来,这部剧应该也是赵 ...

  8. flv视频转换成mp4格式怎么转?

    flv视频转换成mp4格式怎么转?相信正在阅读文章的你,一定接触到了flv视频文件.flv是一种新型的小体积视频格式,因为体积小的特点使得flv的加载速度特别快,从而实现了在线观看浏览视频也很顺畅的愿 ...

  9. avi视频怎么转mp4格式?

    avi视频怎么转mp4格式?接触视频文件久了你就会发现一个问题,视频文件不仅仅限于MP4,,mov等格式,罗列一下视频文件的格式不下百余种.那在使用的时候,既要保证视频文件的可用性,又要保证视频的分辨 ...

最新文章

  1. SAP系统日常管理 常见 t-code (二)
  2. 【CentOS Linux 7】实验6【web服务器搭建与管理】
  3. [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
  4. Android安全笔记-Intent和PendingIntent基本概念
  5. 两个字符串日期怎么比较大小_面对家中两个孩子的争抢哭闹,那家长应该怎么处理才比较好呢?...
  6. python信用评分卡建模
  7. 零基础,新手小白看过来!易用可视化工具推荐
  8. java lte cellid 如何获取_Android基站定位——通过手机信号获取基站信息(一)
  9. 简单病毒分析及手工查杀
  10. 多核cpu应用场景_1分钟搞懂 CPU该买多核还是高主频?
  11. Oracle的软解析(soft prase)和硬解析(hard prase)及绑定变量
  12. 解决vue项目路由出现message: Navigating to current location (XXX) is not allowed的问题
  13. JAVA常见的命名规则:见名知意
  14. gem5-gpu 运行 PARSEC2.1
  15. python排序获得秩 (index)
  16. 不得不知道的搜索引擎使用技巧(思维导图版)
  17. 预测|2021软件测试职业发展趋势,附BAT、TMD入职指南!
  18. 2019榆次初三计算机考试时间,2019年晋中中考考试时间安排,晋中中考考试科目科目...
  19. origin怎样将图例调成横排
  20. 以PXE或UEFI PXE网络启动WinPE系统

热门文章

  1. snabbdom源码粗读
  2. Linux 常用網路指令
  3. 操作系统1—4章(最全复习题)
  4. Tomcat7中文文档
  5. 【英语魔法俱乐部——读书笔记】 2 中级句型-复句合句(Complex Sentences、Compound Sentences)...
  6. 携职教育:初级会计考试明明不难,为什么通过率这么低?
  7. 电脑常用的快捷键大全
  8. 【环境配置】macOS的Xcode中使用C++万能头文件bits/stdc++.h
  9. SpringBoot中配置拦截器时,跨域失效
  10. 沉痛哀悼,网页变黑白代码!