前段时间把环境整了下,闲时学习下ffmpeg.

最近在看雷神的创作,边看,边学,感谢雷神!

头文件:

//
//  ffmpeg_read_av_info.hpp
//  ffmpegDemo
//
//  Created by fengsh on 2018/4/15.
//  Copyright © 2018年 fengsh998@163.com. All rights reserved.
//
/**音视频文件信息读取*/#ifndef ffmpeg_read_av_info_hpp
#define ffmpeg_read_av_info_hpp#include <stdio.h>#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"void read_av_info(const char * av_pathfile);#endif /* ffmpeg_read_av_info_hpp */

.c文件

//
//  ffmpeg_read_av_info.c
//  ffmpegDemo
//
//  Created by fengsh on 2018/4/15.
//  QQ : 19985430
//  Copyright © 2018年 fengsh998@163.com. All rights reserved.
//
/**音视频文件信息读取 (ffmpeg version 3.4.2)control+command + 空格 打特殊符号*//*FFmpeg解码流程图(参考雷神的备忘)av_register_all()↓avformat_open_input()↓avformat_find_stream_info()↓avcodec_find_decoder()↓avcodec_open2()|-------------------------------------------←--------↓                                                   |av_read_frame()                                             |↓                                                   |get packet?----------YES--------------                  ||                                ↓                  |NO                            AVPacket              ↑|                                ↓                  ||                       avcodec_decode_video2()     |↓                                ↓                  |close                           AVFrame               |↓                  |show on screen..          |↓                  ||__________________|*/#include "ffmpeg_read_av_info.h"char* BytesToSize( double Bytes )
{float tb = 1099511627776;float gb = 1073741824;float mb = 1048576;float kb = 1024;char returnSize[256];if( Bytes >= tb )sprintf(returnSize, "%.2f TB", (float)Bytes/tb);else if( Bytes >= gb && Bytes < tb )sprintf(returnSize, "%.2f GB", (float)Bytes/gb);else if( Bytes >= mb && Bytes < gb )sprintf(returnSize, "%.2f MB", (float)Bytes/mb);else if( Bytes >= kb && Bytes < mb )sprintf(returnSize, "%.2f KB", (float)Bytes/kb);else if ( Bytes < kb)sprintf(returnSize, "%.2f Bytes", Bytes);elsesprintf(returnSize, "%.2f Bytes", Bytes);static char ret[256];strcpy(ret, returnSize);return ret;
}void read_av_info(const char * av_pathfile)
{AVFormatContext     *pfmtCxt    = NULL;int                 audioStreamIdx  = -1;int                 videoStreamIdx  = -1;//初始化 libavformat和注册所有的muxers、demuxers和protocolsav_register_all();//以输入方式打开一个媒体文件,也即源文件int ok = avformat_open_input(&pfmtCxt, av_pathfile, NULL, NULL);if (ok != 0) {printf("Could not open file.");}//通过读取媒体文件的中的包来获取媒体文件中的流信息,对于没有头信息的文件如(mpeg)是非常有用的//也就是把媒体文件中的音视频流等信息读出来,保存在容器中,以便解码时使用ok = avformat_find_stream_info(pfmtCxt, NULL);if (ok != 0) {printf("find stream info error.");}for (int i = 0; i < pfmtCxt->nb_streams; i++) {if (pfmtCxt->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoStreamIdx = i;} else if (pfmtCxt->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {audioStreamIdx = i;}}AVStream *videostream = NULL;AVStream *audiostream = NULL;if (videoStreamIdx != -1) {videostream = pfmtCxt->streams[videoStreamIdx];}if (audioStreamIdx != -1) {audiostream = pfmtCxt->streams[audioStreamIdx];}printf("==============================av_dump_format==================================\n");av_dump_format(pfmtCxt, 0, 0, 0);/*******************************输出相关media文件信息*******************************/printf("===========================================================================\n");printf("文件名 : %s \n",pfmtCxt->url);printf("输入格式 : %s \n全称 : %s \n",pfmtCxt->iformat->name,pfmtCxt->iformat->long_name);int64_t tns, thh, tmm, tss;tns  = pfmtCxt->duration / 1000000;thh  = tns / 3600;tmm  = (tns % 3600) / 60;tss  = (tns % 60);printf("总时长 : %f ms,fmt:%02lld:%02lld:%02lld \n总比特率 : %f kbs\n",(pfmtCxt->duration * 1.0 / AV_TIME_BASE) * 1000,thh,tmm,tss,pfmtCxt->bit_rate / 1000.0);//1000 bit/s = 1 kbit/sdouble fsize = (pfmtCxt->duration * 1.0 / AV_TIME_BASE * pfmtCxt->bit_rate / 8.0);printf("文件大小 : %s\n",BytesToSize(fsize));printf("协议白名单 : %s \n协义黑名单 : %s\n",pfmtCxt->protocol_whitelist,pfmtCxt->protocol_blacklist);printf("数据包的最大数量 : %d\n",pfmtCxt->max_ts_probe);printf("最大缓冲时间 : %lld\n",pfmtCxt->max_interleave_delta);printf("缓冲帧的最大缓冲 : %u Bytes\n",pfmtCxt->max_picture_buffer);printf("metadata:\n");AVDictionary *metadata = pfmtCxt->metadata;if (metadata) {AVDictionaryEntry *entry = NULL;while ((entry = av_dict_get(metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) {printf("\t%s : %s\n",entry->key,entry->value);}}if (videostream) {printf("视频流信息(%s):\n",av_get_media_type_string(videostream->codecpar->codec_type));printf("\tStream #%d\n",videoStreamIdx);printf("\t总帧数 : %lld\n",videostream->nb_frames);const char *avcodocname = avcodec_get_name(videostream->codecpar->codec_id);const char *profilestring = avcodec_profile_name(videostream->codecpar->codec_id,videostream->codecpar->profile);char * codec_fourcc = av_fourcc2str(videostream->codecpar->codec_tag);printf("\t编码方式 : %s\n\tCodec Profile : %s\n\tCodec FourCC : %s\n",avcodocname,profilestring,codec_fourcc);///如果是C++引用(AVPixelFormat)注意下强转类型const char *pix_fmt_name = videostream->codecpar->format == AV_PIX_FMT_NONE ? "none" : av_get_pix_fmt_name(videostream->codecpar->format);printf("\t显示编码格式(color space) : %s \n",pix_fmt_name);printf("\t宽 : %d pixels,高 : %d pixels \n",videostream->codecpar->width,videostream->codecpar->height);AVRational display_aspect_ratio;av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,videostream->codecpar->width  * (int64_t)videostream->sample_aspect_ratio.num,videostream->codecpar->height * (int64_t)videostream->sample_aspect_ratio.den,1024 * 1024);printf("\tsimple_aspect_ratio(SAR) : %d : %d\n\tdisplay_aspect_ratio(DAR) : %d : %d \n",videostream->sample_aspect_ratio.num,videostream->sample_aspect_ratio.den,display_aspect_ratio.num,display_aspect_ratio.den);printf("\t最低帧率 : %f fps\n\t平均帧率 : %f fps\n",av_q2d(videostream->r_frame_rate),av_q2d(videostream->avg_frame_rate));printf("\t每个像素点的比特数 : %d bits\n",videostream->codecpar->bits_per_raw_sample);printf("\t每个像素点编码比特数 : %d bits\n",videostream->codecpar->bits_per_coded_sample); //YUV三个分量每个分量是8,即24printf("\t视频流比特率 : %f kbps\n",videostream->codecpar->bit_rate / 1000.0);printf("\t基准时间 : %d / %d = %f \n",videostream->time_base.num,videostream->time_base.den,av_q2d(videostream->time_base));printf("\t视频流时长 : %f ms\n",videostream->duration * av_q2d(videostream->time_base) * 1000);printf("\t帧率(tbr) : %f\n",av_q2d(videostream->r_frame_rate));printf("\t文件层的时间精度(tbn) : %f\n",1/av_q2d(videostream->time_base));printf("\t视频层的时间精度(tbc) : %f\n",1/av_q2d(videostream->codec ->time_base));double s = videostream->duration * av_q2d(videostream->time_base);int64_t tbits = videostream->codecpar->bit_rate * s;double stsize = tbits / 8;printf("\t视频流大小(Bytes) : %s \n",BytesToSize(stsize));printf("\tmetadata:\n");AVDictionary *metadata = videostream->metadata;if (metadata) {AVDictionaryEntry *entry = NULL;while ((entry = av_dict_get(metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) {printf("\t\t%s : %s\n",entry->key,entry->value);}}}if (audiostream) {printf("音频流信息(%s):\n",av_get_media_type_string(audiostream->codecpar->codec_type));printf("\tStream #%d\n",audioStreamIdx);printf("\t音频时长 : %f ms\n",audiostream->duration * av_q2d(audiostream->time_base) * 1000);const char *avcodocname = avcodec_get_name(audiostream->codecpar->codec_id);const char *profilestring = avcodec_profile_name(audiostream->codecpar->codec_id,audiostream->codecpar->profile);char * codec_fourcc = av_fourcc2str(audiostream->codecpar->codec_tag);printf("\t编码格式 %s (%s,%s)\n",avcodocname,profilestring,codec_fourcc);printf("\t音频采样率 : %d Hz\n",audiostream->codecpar->sample_rate);printf("\t音频声道数 : %d \n",audiostream->codecpar->channels);printf("\t音频流比特率 : %f kbps\n",audiostream->codecpar->bit_rate / 1000.0);double s = audiostream->duration * av_q2d(audiostream->time_base);int64_t tbits = audiostream->codecpar->bit_rate * s;double stsize = tbits / 8;printf("\t音频流大小(Bytes) : %s\n",BytesToSize(stsize));}}

输出的结果 :

==============================av_dump_format==================================
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '(null)':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf57.41.100comment         : vid:74f08a0dec84478db32d577dc195f449Duration: 00:02:58.64, start: 0.000000, bitrate: 518 kb/sStream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1280:1281 DAR 16:9], 450 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)Metadata:handler_name    : VideoHandlerStream #0:1(und): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 63 kb/s (default)Metadata:handler_name    : SoundHandler
===========================================================================
文件名 : /Users/fengsh/Documents/ffmpeg/test.mp4
输入格式 : mov,mp4,m4a,3gp,3g2,mj2
全称 : QuickTime / MOV
总时长 : 178641.000000 ms,fmt:00:02:58
总比特率 : 518.820000 kbs
文件大小 : 11.05 MB
协议白名单 : file,crypto
协义黑名单 : (null)
数据包的最大数量 : 50
最大缓冲时间 : 10000000
缓冲帧的最大缓冲 : 3041280 Bytes
metadata:major_brand : isomminor_version : 512compatible_brands : isomiso2avc1mp41encoder : Lavf57.41.100comment : vid:74f08a0dec84478db32d577dc195f449
视频流信息(video):Stream #0总帧数 : 4460编码方式 : h264Codec Profile : HighCodec FourCC : avc1显示编码格式(color space) : yuv420p 宽 : 854 pixels,高 : 480 pixels simple_aspect_ratio(SAR) : 1280 : 1281display_aspect_ratio(DAR) : 16 : 9 最低帧率 : 25.000000 fps平均帧率 : 25.000000 fps每个像素点的比特数 : 8 bits每个像素点编码比特数 : 24 bits视频流比特率 : 450.393000 kbps基准时间 : 1 / 12800 = 0.000078 视频流时长 : 178400.000000 ms帧率(tbr) : 25.000000文件层的时间精度(tbn) : 12800.000000视频层的时间精度(tbc) : 50.000000视频流大小(Bytes) : 9.58 MB metadata:language : undhandler_name : VideoHandler
音频流信息(audio):Stream #1音频时长 : 178526.009070 ms编码格式 aac (HE-AAC,mp4a)音频采样率 : 44100 Hz音频声道数 : 2 音频流比特率 : 63.971000 kbps音频流大小(Bytes) : 1.36 MB

估计还有其它格式的文件还没有考虑到,后面熟释了,搞个mac版本的工具玩玩。

FFMPEG学习(4)-使用ffmpeg读取基本音视频文件信息,熟释AVFormatContext结构相关推荐

  1. ffmpeg学习(11)音视频文件muxer(2)多输入混流

    在 ffmpeg学习(3)编码.解码的流程介绍 和 ffmpeg学习(9)音视频文件demuxer中介绍了媒体文件的解封装.本文记录Ffmpeg封装格式另一种处理与与demuxer相反方式–视音频复用 ...

  2. 音视频技术开发周刊:FFmpeg内置的一个无中生有的音视频输入数据 | 214

    每周一期,纵览音视频技术领域的干货. 新闻投稿:contribute@livevideostack.com 火山引擎视频云:坚持基础技术创新,打造极致用户体验 从toC到toB,作为抖音背后的视频技术 ...

  3. FFmpeg学习之八(FFmpeg源码编译)

    FFmpeg学习之八(FFmpeg源码编译) Mac下 FFmpeg源码编译 安装 1. 使用终端安装FFmpeg 2. 手动编译 2.1 编译环境 - Xcode 2.2 安装依赖库 2.3 安装F ...

  4. ffmpeg为mkv封装格式的音视频文件添加内挂字幕

    现在好莱坞的电影,都是全球看,一个地区的人看电影时,电影屏幕上应该展示对应的本地区语言字幕.故电影画面在不同的地区,需要配置不同的语言字幕.故视频画面里面的字幕应该可以拆出来,不能像老版三国演义,每到 ...

  5. 音视频开发成长之路—进阶之路3个重要知识点丨WebRTC丨FFmpeg丨SRS流媒体服务器丨C++音视频丨嵌入式音视频

    音视频开发成长之路-进阶之路3个重要知识点 视频讲解如下,点击观看: 音视频开发成长之路-进阶之路3个重要知识点丨WebRTC丨FFmpeg丨SRS流媒体服务器丨C++音视频丨嵌入式音视频 音视频高级 ...

  6. FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

    在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...

  7. ffmpeg sdk java_推荐一个强大的音视频处理的开源项目!

    原标题:推荐一个强大的音视频处理的开源项目! 1.前景提要 在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用就 ...

  8. ffmpeg音视频文件音视频流抽取,初步尝试人声分离

    文章目录 ffmpeg抽取音视频文件中的音频流 音频流类型 AAC与m4a的区别 AAC与mp3的区别 用ffmpeg查看视频的信息 用ffmpeg抽取AAC音频流 从AAC文件中获取音轨 音轨是什么 ...

  9. 关于.m4s音视频文件合成.mp4文件的方法

    关于.m4s音视频文件合成.mp4文件的方法 这几天在家闲着没事想着玩一下快手,于是就去做了一次视频搬运工,从B站上找了一些比较不错的优秀短片使用工具下载下来然后上传到个人快手号上,谁知道从B站上下载 ...

最新文章

  1. java fseek_转到C中的二进制文件的某个点(使用fseek),然后从该位置读取(使用fread)...
  2. 从头学习Drupal--基本架构二
  3. BEA WebLogic平台下J2EE调优攻略--转载
  4. mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
  5. Ubuntu如何启动Pycharm
  6. JAVA 8 LIST<对象> 转换SET
  7. c语言表达式求值的空间复杂度,373-时间复杂度(表达式求值)
  8. mysql 跳过一个事物_MySQL基于GTID的数据恢复
  9. java多数据源事务处理_springboot整合多数据源解决分布式事务
  10. .NET之对接口和抽象类(二)
  11. ROS 教程之navigation: 用程序设定导航目标点
  12. 当新华社遇上华为云 权威新闻全球传播再添“神器”
  13. 别傻傻分不清docker run 和 start 的区别了
  14. android实现本地视频播放功能,Android开发 MediaPlayer入门_播放本地视频
  15. Vue 2.x折腾记 - (15) 捣鼓一个中规中矩loading组件
  16. 如何解决SQLServer已超过了锁请求超时时段
  17. 太极安装的应用打开闪退_BUG:通过太极阴创建应用什么值得买的过程中太极闪退,应用创建失败...
  18. C#实现毫秒级计时器
  19. “微信之父”张小龙年薪3亿,曾独自一人完成7万行代码
  20. 雅虎市值_雅虎! 一头扎进报纸业务

热门文章

  1. 两类Linux系统的包管理工具
  2. JS小游戏-宇宙战机
  3. MFC vc++ 中CTreeContrl如何自定义实现鼠标单击或双击响应事件 ,即重写类似于控件的响应事件或消息
  4. 梅奥的人际关系理论(1933)--轉
  5. 彩色模型,CIE XYZ,CIE RGB
  6. 究竟什么是服务器?起什么作用
  7. oracle数据库linux冷备,linux/windows系统oracle数据库简单冷备同步
  8. `墙`内各种软件源集结
  9. 打开cad未响应几类问题及解决办法
  10. HGP:STM32的用标准库函数自己编写的关于设置系统时钟72Mhz的函数