用FFmpeg获取视频流+音频流的信息(编码格式、分辨率、帧率、播放时长...)

简介

我们经常需要知道一个媒体文件所包含的媒体流的信息,比如文件格式、播放时长、码率、视音频编码格式,视频分辨率,帧率,音频属性等信息。

如何使用FFmpeg API获取这些信息呢?

媒体容器封装格式

文件播放时长

文件平均码率(视频+音频)

视频属性(编码器名称、视频分辨率、帧率、编码码率)

音频属性(编码器名称、采样率、声道数、编码码率)

avformat_open_input

avformat_find_stream_info

伪代码:

/// 数据结构:大管家婆

AVFormatContext* m_inputAVFormatCxt = NULL;

/// 打开文件

res = avformat_open_input(&m_inputAVFormatCxt, filepath, 0, NULL);

/// 查找流信息

if (avformat_find_stream_info(m_inputAVFormatCxt, 0) < 0)

av_dump_format(m_inputAVFormatCxt, 0, filepath, 0);

///avformat_close_input(&m_inputAVFormatCxt);

/// 遍历流信息:音频、视频

for (int i = 0; i < m_inputAVFormatCxt->nb_streams; i++)

{

AVStream *in_stream = m_inputAVFormatCxt->streams[i];

if (in_stream->codec->codec_type == AVMEDIA_TYPE_VIDEO)

{

}

}

///查找解码器

if (avmi->videoStreamIndex != -1)

{

AVCodecContext *avctx;

AVCodec *codec;

do

{

avctx = m_inputAVFormatCxt->streams[avmi->videoStreamIndex]->codec;

// 寻找视频解码器

codec = avcodec_find_decoder(avctx->codec_id);

}

}

获取音视频流基本信息

int ret = -1;

int i = 0;

AVFormatContext * avFmtCtx = NULL; // 大管家婆

if (avmi == NULL || filepath == NULL) {

return;

}

/// 1. 打开音视频文件或网络流

ret = avformat_open_input(&avFmtCtx, filepath, NULL, NULL);

if (ret < 0) {

printf("error avformat_open_input:%s\n", filepath);

return;

}

/// 2. 进一步读取音视频流信息

avformat_find_stream_info(avFmtCtx, NULL);

/// 3. 打印音视频流信息

av_dump_format(avFmtCtx, 0, filepath, 0);

读取总时长和总码率

/// 继续深入,读取更多的字段

avmi->duration =  avFmtCtx->duration; //时长

avmi->totalBitrate = avFmtCtx->bit_rate; //总码率

printf("duration=%lld, totalBitrate=%lld\n",

avmi->duration,

avmi->totalBitrate);

读取视频宽高帧率和音频的声道数采样率

/// 分别读取音视频流,更多的参数

//avFmtCtx->nb_streams

for (i = 0; i < avFmtCtx->nb_streams; i++) {

AVStream *avstmp =  avFmtCtx->streams[i];//拿到具体的一路流

if (avstmp->codec->codec_type == AVMEDIA_TYPE_VIDEO) {

avmi->videoStreamIndex = i;

avmi->width = avstmp->codec->width;

avmi->height = avstmp->codec->height;

/// 视频帧率:avg_frame_rate

/// fps: frames per second

if (avstmp->avg_frame_rate.num != 0

&& avstmp->avg_frame_rate.den != 0) {

avmi->frameRate = (double)avstmp->avg_frame_rate.num / (double)avstmp->avg_frame_rate.den;

}

printf("width=%d, height=%d, frameRate=%.3lf\n",

avmi->width,

avmi->height,

avmi->frameRate);

}

else if (avstmp->codec->codec_type == AVMEDIA_TYPE_AUDIO) {

avmi->audioStreamIndex = i;

avmi->channels = avstmp->codec->channels;

avmi->sampleRate = avstmp->codec->sample_rate;

printf("channels=%d, sampleRate=%d\n",

avmi->channels,

avmi->sampleRate);

}

}

读取音视频解码器的名称

///查找解码器

if (avmi->videoStreamIndex != -1)

{

AVCodecContext *avctx;

AVCodec *codec;

do

{

avctx = m_inputAVFormatCxt->streams[avmi->videoStreamIndex]->codec;

// 寻找视频解码器

codec = avcodec_find_decoder(avctx->codec_id);

}

}

大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦。

《FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社》

京东自营链接:https://item.jd.com/13377793.html
京东其它链接:https://search.jd.com/Search?keyword=FFmpeg%E5%85%A5%E9%97%A8%E8%AF%A6%E8%A7%A3--%E9%9F%B3%E8%A7%86%E9%A2%91%E5%8E%9F%E7%90%86%E5%8F%8A%E5%BA%94%E7%94%A8&enc=utf-8&suggest=1.his.0.0&wq=&pvid=24e80535073b4e1f98e30a3e6963fe81

 

出书过程非常艰辛,来回校正了好几遍,后续还有FFmpeg系列的其它图书。

第一本:FFmpeg入门详解--音视频原理及应用--梅会东--清华大学出版社

第二本:FFmpeg入门详解--流媒体直播原理及应用--梅会东--清华大学出版社

第三本:FFmpeg入门详解--命令行及音视频特效原理及应用--梅会东--清华大学出版社

第四本:FFmpeg入门详解--SDK二次开发及直播美颜原理及应用--梅会东--清华大学出版社

===================================

FFmpeg入门详解之70:获取音视频流信息(Metadata)相关推荐

  1. FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation),笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完 ...

  2. FFmpeg入门详解之2:音视频到底是什么

    视频是什么? 动画书 不知道大家小时候是否玩过一种动画小人书,连续翻动的时候,小人书的画面就会变成一个动画,类似现在的gif格式图片.请注意:翻动速度一定要够快. 本来是一本静态的小人书,通过翻动以后 ...

  3. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

    大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...

  4. FFmpeg入门详解之83:流媒体与直播技术

    流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...

  5. FFmpeg入门详解之117:视频监控的架构和流程

    几张架构图带您快速了解视频监控 图一 图二 图三 图四 视频监控系统的简介 视频监控 视频监控是安全防范系统的重要组成部分,英文Cameras and Surveillance.传统的监控系统包括前端 ...

  6. FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战

    6.Qt5+FFmpeg本地摄像头采集预览实战 源码工程:S26_Test2 FFmpeg命令行处理摄像头 ffmpeg -list_devices true -f dshow -i dummy 命令 ...

  7. FFmpeg入门详解之119:FFmpeg的SDK编程回顾总结并操练

    3.FFmpeg的SDK编程回顾总结并操练 参考课程:"FFmpeg4.3--系列5--SDK二次开发详解与实战" FFmpeg主要框架 FFmpeg骨架:"八大金刚&q ...

  8. FFmpeg入门详解之86:RTP/RTCP协议讲解

    RTP RTP:(Real-time Transport Protocol) 是用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建 ...

  9. FFmpeg入门详解之112:RTP/RTCP协议讲解

    RTP RTP:(Real-time Transport Protocol) 是用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建 ...

最新文章

  1. 在Ubuntu 14.04 64bit上使用dig
  2. linux ping 连续,在SUN Solaris下连续ping的使用
  3. Java最大的优势真的在于跨平台吗?
  4. Boost正则表达式
  5. 聚类树状图_聚集聚类和树状图-解释
  6. 滑雪(信息学奥赛一本通-T1280)
  7. 募捐:请帮助一名 Linux 程序员的女儿
  8. 前端当前是否处在一个糟糕的时代?
  9. 92.与上游服务建立连接
  10. Maven—Windows操作系统中安装配置Maven环境
  11. React:工程化开发
  12. Flutter 开发环境搭建Unable to ‘pub upgrade‘ flutter tool. Retrying in five seconds...
  13. 前端多语言开发,如何中英文切换
  14. 中控人脸指纹考勤机怎么如何偷偷修改数据记录
  15. MySQL事务与存储引擎
  16. 仓库拣货标签——流程卡
  17. Python认证现已生效,并且其他freeCodeCamp 7.0版课程更新
  18. Word交叉输入汉字和英文间距变大
  19. 红帽8培训笔记2day
  20. 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)

热门文章

  1. 你还不会用CAD一键布置停车位?赶紧学起来!
  2. 搜索淘宝/天猫店铺列表 API 接口
  3. 桌面上的desktop.ini是什么文件?
  4. SQL中GRANT(分配权限)和REVOKE(回收权限)向用户授权或取消授权
  5. c语言 秦九韶算法,高二数学期末复习秦九韶算法与排序的知识点
  6. 乐高亲子主题活动 乐高X 起亚智能
  7. 动作游戏战斗系统设计综述
  8. 淘宝天猫内部优惠券领取
  9. 二十九、接了一单Python数据分析的私活,心痛
  10. excel每行数据按模板导出一个或多个文件,可插入图片、条形码或二维码