【C语言ffmpeg】打开第一个视频

文章目录

  • 前言
    • 须知
    • ffmpeg打开文件基本流程图
    • ffmpeg打开媒体文件
      • `AVFormatContext *avformat_alloc_context(void);`
      • AVFormatContext 成员变量及其作用
        • `AVInputFormat *iformat`
        • `AVOutputFormat *oformat`
        • `void *priv_data`
        • `AVIOContext *pb`
        • `unsigned int nb_streams`
        • `AVStream **streams`
        • `char filename[1024]`
        • `int64_t duration`
        • `int64_t bit_rate`
        • `unsigned int nb_programs`
        • `AVProgram **programs`
        • `AVChapter **chapters`
        • `unsigned int nb_chapters`
        • `AVDictionary *metadata`
        • `int flags`
        • `int64_t start_time`
        • `int64_t start_time_realtime`
        • `int probesize`
        • `int max_analyze_duration`
        • `AVPacketList *packet_buffer`
      • `int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);`
      • `int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);`
      • `void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);`
      • `AVCodec *avcodec_find_decoder(enum AVCodecID id);`
      • `const char *avcodec_get_name(enum AVCodecID id);`
      • `const char *av_get_media_type_string(enum AVMediaType media_type);`
      • `void avformat_close_input(AVFormatContext **s);`
    • 示例
  • 总结


前言

FFmpeg 是一个强大的多媒体处理库,广泛应用于音视频编解码、转换和流媒体处理等领域。C语言作为一种底层编程语言,与FFmpeg结合使用,可以高效地处理各种音视频任务。在本篇文章中,我们将探讨如何利用C语言和FFmpeg库打开一个音视频文件,并对其进行基本的处理操作。这不仅为深入学习FFmpeg的使用打下基础,也为从事多媒体处理工作的开发者提供实用的参考。


须知

本教程使用ffmpeg版本为7.0.1如有函数不同请下载和我一样的版本

ffmpeg打开文件基本流程图

开始↓
包含头文件和定义视频文件路径↓
分配格式上下文↓
打开输入文件↓
|----------------------|
| 打开失败             |
||
| 打印错误信息并返回   |
|----------------------|↓
检查文件中的流信息↓
|----------------------|
| 检查失败             |
||
| 打印错误信息并关闭文件 |
|----------------------|↓
打印文件格式信息↓
遍历所有流↓
获取流和编解码参数↓
查找解码器↓
打印流的基本信息↓
|----------------------|
| 没有找到解码器       |
||
| 打印不支持的编解码器 |
|----------------------|↓
关闭输入文件并释放格式上下文↓
结束

ffmpeg打开媒体文件

AVFormatContext *avformat_alloc_context(void);

  • 作用: 分配并初始化 AVFormatContext 结构体。
  • 参数: 无。
  • 返回值: 指向新分配的 AVFormatContext 的指针。

AVFormatContext 结构体是 FFmpeg 中非常重要的一个数据结构,它包含了与多媒体文件或流相关的所有信息。以下是一些常用且重要的成员及其作用:

AVFormatContext 成员变量及其作用

AVInputFormat *iformat
  • 作用: 指向输入格式的指针。当打开输入文件时,这个成员将指向描述文件格式的 AVInputFormat 结构。
AVOutputFormat *oformat
  • 作用: 指向输出格式的指针。当创建输出文件时,这个成员将指向描述文件格式的 AVOutputFormat 结构。
void *priv_data
  • 作用: 私有数据,存储特定于输入/输出格式的私有数据。
AVIOContext *pb
  • 作用: I/O 上下文,用于管理文件或流的输入/输出操作。
unsigned int nb_streams
  • 作用: 文件中的流数量。
AVStream **streams
  • 作用: 指向包含所有流(音频、视频、字幕等)的指针数组。
char filename[1024]
  • 作用: 文件名或 URL。
int64_t duration
  • 作用: 文件的总时长(以 AV_TIME_BASE 为单位)。
int64_t bit_rate
  • 作用: 文件的总比特率(以比特每秒为单位)。
unsigned int nb_programs
  • 作用: 文件中节目的数量。
AVProgram **programs
  • 作用: 指向包含所有节目的指针数组。
AVChapter **chapters
  • 作用: 指向包含所有章节的指针数组。
unsigned int nb_chapters
  • 作用: 文件中的章节数量。
AVDictionary *metadata
  • 作用: 文件的元数据(如标题、作者、版权等)。
int flags
  • 作用: 标志位,用于控制各种操作行为。
int64_t start_time
  • 作用: 文件的开始时间(以 AV_TIME_BASE 为单位)。
int64_t start_time_realtime
  • 作用: 以实时起始时间的时间戳表示的开始时间。
int probesize
  • 作用: 探测的大小,用于确定文件的格式。
int max_analyze_duration
  • 作用: 分析的最大时长,用于确定文件的格式。
AVPacketList *packet_buffer
  • 作用: 包含读取的数据包的缓冲区。

以下示例展示如何访问 AVFormatContext 的一些成员变量:

AVFormatContext *formatContext = avformat_alloc_context();
if (avformat_open_input(&formatContext, "example.mp4", NULL, NULL) == 0) {printf("Format: %s\n", formatContext->iformat->name);printf("Number of streams: %u\n", formatContext->nb_streams);printf("Duration: %" PRId64 "\n", formatContext->duration);printf("Bit rate: %" PRId64 "\n", formatContext->bit_rate);for (unsigned int i = 0; i < formatContext->nb_streams; i++) {AVStream *stream = formatContext->streams[i];printf("Stream #%u\n", i);printf("  Codec ID: %d\n", stream->codecpar->codec_id);printf("  Codec type: %s\n", av_get_media_type_string(stream->codecpar->codec_type));}avformat_close_input(&formatContext);
}

int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);

  • 作用: 打开输入文件并读取头部信息。
  • 参数:
    • ps: 指向 AVFormatContext 指针的指针。
    • filename: 文件名。
    • fmt: 指定输入格式,可以为 NULL。
    • options: 一些额外的选项,可以为 NULL。
  • 返回值: 成功返回 0,失败返回负值。

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

  • 作用: 检查文件中的流信息。
  • 参数:
    • ic: AVFormatContext 指针。
    • options: 一些额外的选项,可以为 NULL。
  • 返回值: 成功返回非负值,失败返回负值。

void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);

  • 作用: 打印文件格式信息。
  • 参数:
    • ic: AVFormatContext 指针。
    • index: 要打印的流的索引,为 0 表示打印全部流信息。
    • url: 文件的 URL。
    • is_output: 指示是输入还是输出格式,0 表示输入,1 表示输出。
  • 返回值: 无。

AVCodec *avcodec_find_decoder(enum AVCodecID id);

  • 作用: 查找给定 codec id 的解码器。
  • 参数:
    • id: codec 的 ID。
  • 返回值: 指向 AVCodec 的指针,如果未找到返回 NULL。

const char *avcodec_get_name(enum AVCodecID id);

  • 作用: 获取 codec id 对应的 codec 名称。
  • 参数:
    • id: codec 的 ID。
  • 返回值: codec 名称的字符串指针。

const char *av_get_media_type_string(enum AVMediaType media_type);

  • 作用: 获取媒体类型的字符串表示。
  • 参数:
    • media_type: 媒体类型。
  • 返回值: 媒体类型名称的字符串指针。

void avformat_close_input(AVFormatContext **s);

  • 作用: 关闭输入文件并释放格式上下文。
  • 参数:
    • s: 指向 AVFormatContext 指针的指针。
  • 返回值: 无。

示例

#include <stdio.h>
#include "include/libavcodec/avcodec.h"
#include "include/libavformat/avformat.h"
#include "include/libavutil/avutil.h"int main() {const char *videoname = "/home/ubuntu/MyFFMPEG/template_c_first/test2.mp4";//打开输入文件并读取头部信息AVFormatContext *formatContext = avformat_alloc_context();if(avformat_open_input(&formatContext,videoname,NULL,NULL) != 0){printf("open err:%s\n",videoname);return -1;}// 检查文件中的流信息if (avformat_find_stream_info(formatContext, NULL) < 0) {printf("Could not find stream information in file %s\n", videoname);avformat_close_input(&formatContext);return -1;}// 打印文件格式信息av_dump_format(formatContext, 0, videoname, 0);// 遍历所有流并打印流信息for (unsigned int i = 0; i < formatContext->nb_streams; i++) {AVStream *stream = formatContext->streams[i];AVCodecParameters *codecParams = stream->codecpar;AVCodec *codec = avcodec_find_decoder(codecParams->codec_id);if (codec == NULL) {printf("Unsupported codec!\n");continue;}printf("Stream #%u:\n", i);printf("  Codec: %s (%s)\n", codec->name, avcodec_get_name(codecParams->codec_id));printf("  Type: %s\n", av_get_media_type_string(codecParams->codec_type));printf("  Duration: %ld\n", stream->duration);printf("  Time base: %d/%d\n", stream->time_base.num, stream->time_base.den);}// 关闭输入文件并释放格式上下文avformat_close_input(&formatContext);return 0;
}

输出:

ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c_first/build$ ./ffmpeg_test 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/ubuntu/MyFFMPEG/template_c_first/test2.mp4':Metadata:major_brand     : isomminor_version   : 512compatible_brands: isomiso2avc1mp41encoder         : Lavf61.1.100description     : Packed by Bilibili XCoder v2.0.2Duration: 00:00:30.07, start: 0.000000, bitrate: 3275 kb/sStream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 3124 kb/s, 60 fps, 60 tbr, 16k tbn (default)Metadata:handler_name    : Bento4 Video Handlervendor_id       : [0][0][0][0]Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 135 kb/s (default)Metadata:handler_name    : Bento4 Sound Handlervendor_id       : [0][0][0][0]
Stream #0:Codec: h264 (h264)Type: videoDuration: 481066Time base: 1/16000
Stream #1:Codec: aac (aac)Type: audioDuration: 1323000Time base: 1/44100

总结

通过本文的介绍,我们了解了如何使用C语言结合FFmpeg库来打开一个音视频文件,并对其进行基本处理。FFmpeg提供了丰富的功能和灵活的接口,能够满足各种多媒体处理需求。掌握FFmpeg的使用方法,不仅能够提升我们在多媒体领域的开发效率,还能拓宽我们的技术视野。希望本篇文章能为读者提供有益的帮助,激发进一步探索FFmpeg和多媒体处理技术的兴趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 232.用栈实现队列 C写法

LeetCode 232.用栈实现队列 C写法 思路&#x1f9d0;&#xff1a; 栈代码在本篇中。与队列实现栈类似&#xff0c;不过这里我们建立两个栈&#xff0c;一个栈专门存放入队数据&#xff0c;一个专门存放出队数据&#xff0c;不需要再来回导数据。原理在于一个栈的数据到另一个栈…

Windows右键新建Markdown文件类型配置 | Typora | VSCode

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的是如何在右键的新建菜单中添加新建MarkdownFile文件&#xff0c;这是毛毛张分享的关于Typora软件的相关知识的第三期 文章目录 1.前言&#x1f3dd;…

「MQTT over QUIC」与「MQTT over TCP」与 「TCP 」通信测试报告

一、结论 在实车5G测试中「MQTT Over QUIC」整体表现优于「TCP」&#xff0c;可在系统架构升级时采用MQTT Over QUIC替换原有的TCP通讯&#xff1b;从实现原理上基于QUIC比基于TCP在弱网、网络抖动导致频繁重连场景延迟更低。 二、测试方案 网络类型&#xff1a;实车5G、实车…

Easysearch、Elasticsearch、Amazon OpenSearch 快照兼容对比

启动集群 Easysearch sysctl -w vm.max_map_count262144Amazon OpenSearch Elasticsearch 由于这个docker compose没有关于kibana的配置&#xff0c;所以我们还是用Console添加原生的Elasticsearch集群 集群信息 快照还原的步骤 快照前的准备 插件安装 本次测试选择把索…

【微服务】feign使用

【微服务】feign使用 引入依赖启动类配置注解创建业务层使用项目调用可能会遇到的bug 01 引入依赖 Feign是Spring Cloud提供的一个声明式的伪Http客户端&#xff0c; 它使得调用远程服务就像调用本地服务一样简单&#xff0c; 只需要创建一个接口并添加一个注解即可。在需要…

解决echarts在uniapp里tooltip,legend不能点击的问题

在main.js文件里面添加&#xff0c;这样tooltip就可以点击&#xff0c;但是legend可能还不能点击&#xff0c; window.wx {} // 在使用获取echarts dom使用 echarts.env.touchEventsSupported false; echarts.env.wxa false; const chartContainer this.$refs.chartContai…

生产力工具|Endnote 21 Macwin版本安装

一、软件下载&#xff1a; &#xff08;一&#xff09;mac版本 Endnote 21版本下载&#xff1a;点击下载 Endnote 20版本下载&#xff1a;点击下载 Endnote X9版本下载&#xff1a;点击下载 &#xff08;二&#xff09;Endnote 20 Win版本 第一步&#xff1a;安装好官网软…

Eureka: 微服务架构中的服务发现与注册实践

Eureka介绍与使用教程 你好&#xff0c;我是悦创。 Eureka 是 Netflix 开发的一款服务发现&#xff08;Service Discovery&#xff09;工具&#xff0c;它主要用于云中基于微服务架构的应用程序。Eureka使服务实例能够动态地注册自己&#xff0c;而其他服务实例可以通过 Eure…

【技术前沿 | AI Native应用新纪元:深度解析模型微调的艺术】

在这个智能化浪潮席卷全球的今天&#xff0c;AI技术已经不再是遥不可及的未来概念&#xff0c;而是深深地融入了我们的日常生活与工作中。从智能家居到自动驾驶&#xff0c;从智能客服到医疗诊断&#xff0c;AI正以它独有的方式改变着世界。而在这一过程中&#xff0c;AI Nativ…

随手记:推荐vscode好用的几个小插件

原始用了挺久的插件&#xff0c;先上截图&#xff0c;以后有空再编辑&#xff1a; fittenCode 是一个AI小助手&#xff0c;相对来说很智能&#xff0c;你在vscode当中编写代码&#xff0c;甚至都可以知道你下一步知道干嘛&#xff0c;训练的还可以。而且还可以帮你起名字&…

2024年7月17日(nodejs,npm设置国内镜像,vue脚手架,远程管理ssh,踢出用户,scp命令,ssh免密登录)

1、安装nodejs服务 nodejs是一个运行1环境&#xff0c;和javajdk运行环境格式一样 [roota ~]# yum -y install nodejs.x86_64 安装完成之后&#xff0c;使用node -v 查看版本 [roota ~]# node -v v16.20.2 2、简易服务器的环境安装npm 安装包管理器 npm node packae manger [ro…

云计算实训09——rsync远程同步、自动化推取文件、对rsyncd服务进行加密操作、远程监控脚本

一、rsync远程同步 1.rsync基本概述 &#xff08;1&#xff09;sync同步 &#xff08;2&#xff09;async异步 &#xff08;3&#xff09;rsync远程同步 2.rsync的特点 可以镜像保存整个目录树和文件系统 可以保留原有权限&#xff0c;owner,group,时间&#xff0c;软硬链…

数据分析入门:用Python和Numpy探索音乐流行趋势

一、引言 音乐是文化的重要组成部分&#xff0c;而音乐流行趋势则反映了社会文化的变迁和人们审美的变化。通过分析音乐榜单&#xff0c;我们可以了解哪些歌曲或歌手正在受到大众的欢迎&#xff0c;甚至预测未来的流行趋势。Python作为一种强大的编程语言&#xff0c;结合其丰…

[数据集][目标检测]导盲犬拐杖检测数据集VOC+YOLO格式4635张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4635 标注数量(xml文件个数)&#xff1a;4635 标注数量(txt文件个数)&#xff1a;4635 标注…

【ubuntu】没有声音??连不上网络???

一. ubuntu 突然之后没有声音&#xff1f;&#xff1f;&#xff1f; 卸载并重新加载 ALSA 驱动&#xff1a; 使用 alsa force-reload 命令来卸载并重新加载 ALSA 驱动&#xff1a; sudo alsa reload还不行&#xff1f;那就强制 reload sudo alsa force-reload二. ubuntu 突…

深入剖析CommonJS modules和ECMAScript modules

目录 前言CommonJS&#xff1a;服务器端模块化的先驱背景与起源语法与机制 ECMAScript Modules&#xff1a;现代前端的基石背景与起源语法与机制 比较与权衡语法差异加载机制编译时与运行时运行时行为构建第三方库现代开发环境 结论 前言 在 JavaScript 生态系统中&#xff0c…

RabbitMQ学习实践一:MQ的安装

文章是本人在学习springboot实现消息队列功能时所经历的过程的记录&#xff0c;仅供参考&#xff0c;如有侵权请随时指出。 参考文章地址&#xff1a; RabbitMQ安装与入门_rabbitmq win11配置-CSDN博客 RabbitMQ入门到实战一篇文章就够了-CSDN博客 RabbitMQ系列&#xff08…

【LeetCode】十五、回溯法:括号生成 + 子集

文章目录 1、回溯法2、leetcode22&#xff1a;括号生成3、leetcode78&#xff1a;子集 1、回溯法 使用场景&#xff0c;如找[1&#xff0c;2&#xff0c;3]的所有子集&#xff1a; 2、leetcode22&#xff1a;括号生成 以n2为例&#xff0c;即两个左括号、两个右括号&#xff0c…

汇编实验5

本实验在32位Linux虚拟机中完成&#xff08;点击查看安装教程&#xff09; 实验内容 二进制炸弹实际是由C语言源程序生成的可执行目标代码&#xff0c;主程序可参考bomb.c。运行时&#xff0c;会按次序提示用户输入3个不同的字符串。如果输入的字符串有误&#xff0c;炸弹就会…

随手记:vsCode修改主题色为自定义颜色

因为工作需要长时间面对vscode&#xff0c;视力不好&#xff0c;想要把工具改成护眼色&#xff0c;于是就把vscode改成了自定义的护眼色 效果图&#xff1a; 操作步骤&#xff1a; 快捷键打开设置页面&#xff1a; 按住ctrlshiftp 选择Open setting 按回车键 打开setting页面编…