ffmpeg+x264编码mp4格式的视频出现视频帧率很大,导致视频无法播放的问题
最新用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格式的视频出现视频帧率很大,导致视频无法播放的问题相关推荐
- 【Bug修复】yuv生成mp4格式文件帧数(时间)与原视频不一致
问题描述 需要将一系列的视频从yuv格式的文件编码成每秒30帧的视频,但是在yuv生成mp4格式时,存在帧数不对齐的问题. 1.准备两个视频 Animation_1080P-209f.mkv,25fp ...
- ffmpeg + x264 编码H264(x86+arm)
一.x86-linux 1. 编译x264 我用的是目前最新版:x264-snapshot-20101130-2245.tar.bz2 ./configure --disable-asm mak ...
- swf怎么转换成mp4格式,5个方法都很简单
swf怎么转换成mp4格式?各位小伙伴们有没有遇到过想要打开swf文件却需要安装flash插件的情况呢?其实,swf文件是flash软件或者animate软件导出的flash软件的专属格式,主要应用于 ...
- ffmpeg实现将MP4格式转封装成avi格式
https://blog.csdn.net/IOT_SHUN/article/details/79739366
- NVD视频解码器SDK使用、大华视频解码器SDK使用
最近调用了视频解码器的接口 因为dll是c++编写的 而我在c#中调用 所以有一个结构体中的类型转换一直报错 今天得到高人指点 把问题解决了 发到网上 供有问题的同胞参考(我之前在网上找了很 ...
- 如何将OGV格式的视频转换成MP4格式
在日常生活中,看视频是必定会做的事情,但有时因为无法播放视频,有些可能是视频文件损坏,但一般都是视频格式比较特殊,播放器不支持某种视频格式的编码所以才无法播放.比如非常少见的OGV格式.OGV视频HT ...
- qsv格式爱奇艺视频知否如何转换成MP4格式
最近有一部电视剧很火,说出来大家要都知道,那就是<知否知否应是绿肥红瘦>.这部剧是由赵丽颖.冯绍峰领衔主演,朱一龙.施诗.张佳宁等特别出演的古代社会家庭题材电视剧.说起来,这部剧应该也是赵 ...
- flv视频转换成mp4格式怎么转?
flv视频转换成mp4格式怎么转?相信正在阅读文章的你,一定接触到了flv视频文件.flv是一种新型的小体积视频格式,因为体积小的特点使得flv的加载速度特别快,从而实现了在线观看浏览视频也很顺畅的愿 ...
- avi视频怎么转mp4格式?
avi视频怎么转mp4格式?接触视频文件久了你就会发现一个问题,视频文件不仅仅限于MP4,,mov等格式,罗列一下视频文件的格式不下百余种.那在使用的时候,既要保证视频文件的可用性,又要保证视频的分辨 ...
最新文章
- SAP系统日常管理 常见 t-code (二)
- 【CentOS Linux 7】实验6【web服务器搭建与管理】
- [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
- Android安全笔记-Intent和PendingIntent基本概念
- 两个字符串日期怎么比较大小_面对家中两个孩子的争抢哭闹,那家长应该怎么处理才比较好呢?...
- python信用评分卡建模
- 零基础,新手小白看过来!易用可视化工具推荐
- java lte cellid 如何获取_Android基站定位——通过手机信号获取基站信息(一)
- 简单病毒分析及手工查杀
- 多核cpu应用场景_1分钟搞懂 CPU该买多核还是高主频?
- Oracle的软解析(soft prase)和硬解析(hard prase)及绑定变量
- 解决vue项目路由出现message: Navigating to current location (XXX) is not allowed的问题
- JAVA常见的命名规则:见名知意
- gem5-gpu 运行 PARSEC2.1
- python排序获得秩 (index)
- 不得不知道的搜索引擎使用技巧(思维导图版)
- 预测|2021软件测试职业发展趋势,附BAT、TMD入职指南!
- 2019榆次初三计算机考试时间,2019年晋中中考考试时间安排,晋中中考考试科目科目...
- origin怎样将图例调成横排
- 以PXE或UEFI PXE网络启动WinPE系统
热门文章
- snabbdom源码粗读
- Linux 常用網路指令
- 操作系统1—4章(最全复习题)
- Tomcat7中文文档
- 【英语魔法俱乐部——读书笔记】 2 中级句型-复句合句(Complex Sentences、Compound Sentences)...
- 携职教育:初级会计考试明明不难,为什么通过率这么低?
- 电脑常用的快捷键大全
- 【环境配置】macOS的Xcode中使用C++万能头文件bits/stdc++.h
- SpringBoot中配置拦截器时,跨域失效
- 沉痛哀悼,网页变黑白代码!