音视频之ffmpeg时间基

FFmpeg中有个比较重要的概念就是时间基。

ffmpeg本身有个时间基,视频输入流有时间基,输出流有时间基,音频也是相同道理。

主要的目的是方便他们自己内部计算。

我们先拿视频播放器来举例,其中要对时间进行处理的是视频的时间,音频的时间,然后两者要进行同步。

我们先看timebase的结构体:

这就是一个分数

我们播放一个视频打印日志发现

视频的时间基是1/12800,这个12800怎么算出来的我是真不知道

音频时间基是1/48000,这个还好理解,音频采样率就是48000,也就是一秒钟采样48000个sample,那么每个sample就是对应1/48000秒。

我播放的视频刚好在26秒左右,看打印出来的日志是不是不那么看不懂了。26142其实就是毫秒(ms),不管音频视频的时间有多么奇葩,乘以timebase后都转换成了我们熟悉的毫秒

使用以下方式转换:

我们再以

项目地址

这个中的视频剪辑

就是下面这个,主要解码音视频,编码音视频都涉及到了时间基。

所以用这个说下时间基比较合适(对应文件是

项目地址 中的

VideoClip.cpp):

视频剪辑就是裁剪时间维度,比如我只要视频的4秒到10秒之间的视频,所以涉及的逻辑是先跳转(seek)到附近的关键帧,然后再解码到指定的地方,然后将avframe(yuv数据)进行编码,当然音频也是。

这里面就有输入流(audio,video)的时间基,因为要重新生成一个mp4文件,所以有输出流(audio,video)的时间基。所以我们需要转换

如果不转换要么写入不进去,要么播放有问题。

再看看AV_TIME_BASE:哪里需要用这个时间基呢?

比如我们录像的时候又视频和音频,比如视频的是1秒25帧,音频的采样率是44100。

那么视频的一帧所占的时间是1/25秒,音频的一个sample是1/44100秒,这时他们的时间基就是AV_TIME_BASE。不过还是需要做成分数形式timeBaseFFmpeg = (AVRational) {1, AV_TIME_BASE};我们每编码一个视频帧就需要打上时间戳,比如我们第一帧视频就是1 * (timeBaseFFmpeg * (1 / 25)),音频是相同道理。

但是在输出mp4文件的时候输出流有各自的时间基。所以这个时候需要做个转换。

av_packet_rescale_ts(vPkt, timeBaseFFmpeg, videoOutStream->time_base);

这是直接把AVpacket中对应的duration ,pts,dts都直接转换了。

原文地址:https://www.cnblogs.com/ai2050/p/10733301.html

时间: 2024-10-29 10:15:28

音视频之ffmpeg时间基的相关文章

C++编程音视频库ffmpeg的pts时间换算方法

ffmpeg中的pts,dts,duration时间记录都是基于timebase换算,我们主要分析下pts的时间怎么换算,其它的是一样的换算.ffmpeg的时间换算对许多新接触同学算是一个大坑,很多刚接触ffmpeg的同学都不容易搞清楚它的时间计算方法. 我们先看下ffmpeg时间是怎么算的: 一帧图像(音频)的时间戳(时间戳一般以第一帧为0开始)= pts * (AVRational.num/AVRational.den) 为什么要这么算(挖坑)我们看下ffmpeg的说明: "当有理数用浮点数

音视频开发-FFmpeg

音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡数据混合并与采集的视频信息写入媒体文件或是RMTP协议中. 图片主要属性 包含长/宽/通道数/像素格式(U8/U16/F32),以及排列格式RGBA/YUV.其中通道与像素格式,如在opencv中,CV_8UC1/CV_8UC4,表示1个通道与4个通道的U8格式.而排列格式,简单的分为RGBA类的,

C/C++音视频库ffmpeg的数据包AVPacket分析

ffmpeg下载地址 http://www.ffmpeg.club/ AVPacket是ffmpeg用来存放编码后的视频帧数据,我们来分析一下这个结构体,先贴出ffmpeg3.2中AVPacket声明的源代码: typedef struct AVPacket { /** * A reference to the reference-counted buffer where the packet data is * stored. * May be NULL, then the packet da

音视频框架ffmpeg源码的简要分析

感谢http://m.2cto.com/kf/201201/116171.html这里一系列的文章 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合

FFmpeg中的时间基(time_base), AV_TIME_BASE

AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpeg中的解释如下: /** * Duration of the stream, in AV_TIME_BASE fractional * seconds. Only set this value if you know none of the individual stream * durations

音视频处理概要 markdown

最近要想办法把录制的音视频进行拼接. 比方说此次录制的视频有三段,通过高清直播编码器录制,录制下的标准为h.264 直接用ffmpeg简单拼接,音频会丢失,所以有了此次解决方案(有可能会繁琐,简单方案还在探索中) 1.将分段的文件各自提取音频及视频,音频提取为wave流,视频提取为ts. 视频转为标准格式 音频转为wav 这里音频参数需要查看下原始视频文件中的音频信息 查看文件信息命令: ffmpeg -i 1.mp4 转换命令: ffmpeg -i 1.mp4 -c copy -bsf:v h

音视频处理之FFmpeg封装格式20180510

一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的是,本程序并不进行视音频的编码和解码工作.而是直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件. 本程序的工作原理如下图1所示: 由图可见,本程序并不进行视频和音频的编解码工作,因此本程序和普通的转码软件相比,有以下两个特点: 处理速度极快.视音频编解码算法十分复杂,

利用FFMPEG简单分离音视频数据流

上一篇文章我们搭好了环境并编译出所需的ffmpeg库,本篇我们讨论如何利用ffmpeg提供的API函数进行多媒体文件的解封装(demux)过程.在讲解之前,我们需要了解一些基本的多媒体文件知识,大虾请飘过. 容器格式:不管是音频文件还是视频格式的文件,都是一个多媒体的容器,即container,比如常见的视频容器格式有avi.mp4.mkv.flv.rm/rmvb.mov.ts.vob.dat,音频容器格式有MP3.WAV.AAC.APE,FLAC等等,它容纳了视频.音频.字幕(subtitle

FFmpeg音视频编解码实践总结

PS:由于目前开发RTSP服务器 传输模块时用到了h264文件,所以攻了一段时间去实现h264的视频编解码,借用FFmpeg SDK实现了任意文件格式之间的转换,并实现了流媒体实时播放,目前音视频同步需要稍加完善,视频编码代码已成功移植到Visual Stdio平台,如有需要的留下邮箱 以下文档来自FFmpeg工程组(http://www.ffmpeg.com.cn/index.php开发事例) 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序 本程序源引自FFmpeg工程组,实