一.AVStream

AVCodecContext *codec        // 已过时,使用另一个 codecpar 结构体代替。

AVRational time_base         // 时间基数。

int64_t duration            // 总时长。流的总时长,该参数不可靠。

AVRational avg_frame_rate        // 帧率。

AVCodecParameters *codecpar;     // 包含音视频参数的结构体。很重要,可以用来获取音视频参数中的宽度、高度、采样率、编码格式等信息。

二. AVCodecParameters 

enum AVMediaType codec_type;    // 编码类型。说明这段流数据究竟是音频还是视频。

enum AVCodecID codec_id          // 编码格式。说明这段流的编码格式,h264,MPEG4, MJPEG,etc...

uint32_t  codecTag;                        //  一般不用

int format;                                     //  格式。对于视频来说指的就是像素格式(YUV420,YUV422...),对于音频来说,指的就是音频的采样格式。

int width, int height;                      // 视频的宽高,只有视频有

uint64_t channel_layout;                // 取默认值即可

int channels;                                   // 声道数

int sample_rate;                           // 样本率

int frame_size;                                // 只针对音频,一帧音频的大小

例:打印视频的宽高、编码格式,音频的采样率等信息

  1. AVFormatContext *ic = NULL;
  2. char path[] = "sdcard/1080.mp4";
  3. // char path[] = "/sdcard/qingfeng.flv";
  4. int ret = avformat_open_input(&ic, path, , );
  5. if (ret != ) {
  6. LOGE("avformat_open_input() called failed: %s", av_err2str(ret));
  7. return env->NewStringUTF(hello.c_str());
  8. }
  9. LOGI("avformat_open_input() called success.");
  10. LOGI("duration is: %lld, nb_stream is: %d", ic->duration, ic->nb_streams);
  11. if (avformat_find_stream_info(ic, ) >= ) {
  12. LOGI("duration is: %lld, nb_stream is: %d", ic->duration, ic->nb_streams);
  13. }
  14.  
  15. /**帧率*/
  16. int fps = ;
  17. int videoStream = ;
  18. int audioStream = ;
  19.  
  20. for (int i = ; i < ic->nb_streams; i++) {
  21. AVStream *as = ic->streams[i];
  22. if (as->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
  23. LOGI("视频数据");
  24. videoStream = i;
  25. fps = (int)r2d(as->avg_frame_rate);
  26. LOGI("fps = %d, width = %d, height = %d, codecid = %d, format = %d",
  27. fps,
  28. as->codecpar->width,
  29. as->codecpar->height,
  30. as->codecpar->codec_id,
  31. as->codecpar->format); AVSampleFormat
  32. } else if (as->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
  33. LOGI("音频数据");
  34. audioStream = i;
  35. LOGI("sample_rate = %d, channels = %d, sample_format = %d",
  36. as->codecpar->sample_rate,
  37. as->codecpar->channels,
  38. as->codecpar->format
  39. );
  40. }
  41. }

FFmpeg(5)-AVStream和AVCodecParameters部分参数分析的更多相关文章

  1. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  4. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. FFmpeg 结构体学习(四): AVFrame 分析

    在上文FFmpeg 结构体学习(三): AVPacket 分析我们学习了AVPacket结构体的相关内容.本文,我们将讲述一下AVFrame. AVFrame是包含码流参数较多的结构体.下面我们来分析 ...

  6. FFmpeg 结构体学习(五): AVCodec 分析

    在上文FFmpeg 结构体学习(四): AVFrame 分析我们学习了AVFrame结构体的相关内容.本文,我们将讲述一下AVCodec. AVCodec是存储编解码器信息的结构体.下面我们来分析一下 ...

  7. FFmpeg 结构体学习(六): AVCodecContext 分析

    在上文FFmpeg 结构体学习(五): AVCodec 分析我们学习了AVCodec结构体的相关内容.本文,我们将讲述一下AVCodecContext. AVCodecContext是包含变量较多的结 ...

  8. 5.AVStream和AVCodecParameters

    AVStream和AVCodecParameters 说明: AVStream 结构表示当前媒体流的上下文,着重于所有媒体流共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段. 其中co ...

  9. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

随机推荐

  1. 如何开发一个基于 Docker 的 Python 应用

    前言 Python 家族成员繁多,解决五花八门的业务需求.这里将通过 Python 明星项目 IPython Notebook,使其容器化,让大家掌握基础的 Docker 使用方法. IPython ...

  2. Go map中一个很重要的特性

    先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = &qu ...

  3. BOOST ASIO 学习专贴

    本文已于20170903更新完毕,所有boost asio 代码均为本人手抄.编译器为vs2013,并且所有代码已经上传,本文下方可下载源码 为了学习boost asio库,我是从boost的官方bo ...

  4. [转]TensorFlow---岂止深度学习

    原文链接 TensorFlow不仅可以用于深度学习自动求导,它也可用于构建传统机器学习和经典算法. TensorFlow提供了"一揽子"常用数值计算和机器学习算法的构建模块.在本文 ...

  5. iOS与H5交互

    H5与App原生交互,一般会是前端页面中的JavaScript与App使用的原生开发语言的交互.技术方案应能达到以下要求: 在js与原生进行交互的时候能保证正常的正向调用逻辑返回,反向可以处理异步回调 ...

  6. 【SqlServer】SqlServer中Alter语句的使用

    在修改Sql Server表结构时,常用到Alter语句,把一些常用的alter语句列举如下. 1:向表中添加字段 Alter table [表名] add [列名] 类型 2:  删除字段 Alte ...

  7. thinkphp日志分析

    #!/usr/bin/perl -w use strict; use warnings; use Tie::File; #### # Thinkphp日志分析 # 日志基本格式:{$now} &quo ...

  8. .NET Core 2.0 Cookie中间件 权限验证

    :在ConfigureServices添加Cookie中间件,使用自定义Scheme services.AddAuthentication(options=> { options.Default ...

  9. 让windows能像ubuntu一样方便的神器

    让windows能像ubuntu一样方便的神器: Let's get Chocolatey! Chocolatey NuGet is a Machine Package Manager, somewh ...

  10. 【Qt】StackedWidget

    一个简单的堆栈窗体类: 左側列表框会出现不同的选项,右側显示所选的不同的窗口 #include<QHBoxLayout> #include "stackdlg.h" S ...