FFmpeg入门详解之70:获取音视频流信息(Metadata)
用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)相关推荐
- FFmpeg入门详解之19:音视频封装原理简介
什么是数据封装和解封装? 数据封装(baiData Encapsulation),笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完 ...
- FFmpeg入门详解之2:音视频到底是什么
视频是什么? 动画书 不知道大家小时候是否玩过一种动画小人书,连续翻动的时候,小人书的画面就会变成一个动画,类似现在的gif格式图片.请注意:翻动速度一定要够快. 本来是一本静态的小人书,通过翻动以后 ...
- FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社
大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...
- FFmpeg入门详解之83:流媒体与直播技术
流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...
- FFmpeg入门详解之117:视频监控的架构和流程
几张架构图带您快速了解视频监控 图一 图二 图三 图四 视频监控系统的简介 视频监控 视频监控是安全防范系统的重要组成部分,英文Cameras and Surveillance.传统的监控系统包括前端 ...
- FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战
6.Qt5+FFmpeg本地摄像头采集预览实战 源码工程:S26_Test2 FFmpeg命令行处理摄像头 ffmpeg -list_devices true -f dshow -i dummy 命令 ...
- FFmpeg入门详解之119:FFmpeg的SDK编程回顾总结并操练
3.FFmpeg的SDK编程回顾总结并操练 参考课程:"FFmpeg4.3--系列5--SDK二次开发详解与实战" FFmpeg主要框架 FFmpeg骨架:"八大金刚&q ...
- FFmpeg入门详解之86:RTP/RTCP协议讲解
RTP RTP:(Real-time Transport Protocol) 是用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建 ...
- FFmpeg入门详解之112:RTP/RTCP协议讲解
RTP RTP:(Real-time Transport Protocol) 是用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建 ...
最新文章
- 在Ubuntu 14.04 64bit上使用dig
- linux ping 连续,在SUN Solaris下连续ping的使用
- Java最大的优势真的在于跨平台吗?
- Boost正则表达式
- 聚类树状图_聚集聚类和树状图-解释
- 滑雪(信息学奥赛一本通-T1280)
- 募捐:请帮助一名 Linux 程序员的女儿
- 前端当前是否处在一个糟糕的时代?
- 92.与上游服务建立连接
- Maven—Windows操作系统中安装配置Maven环境
- React:工程化开发
- Flutter 开发环境搭建Unable to ‘pub upgrade‘ flutter tool. Retrying in five seconds...
- 前端多语言开发,如何中英文切换
- 中控人脸指纹考勤机怎么如何偷偷修改数据记录
- MySQL事务与存储引擎
- 仓库拣货标签——流程卡
- Python认证现已生效,并且其他freeCodeCamp 7.0版课程更新
- Word交叉输入汉字和英文间距变大
- 红帽8培训笔记2day
- 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)