ffmpeg入门

news2024/12/25 12:23:01

ffmpeg入——安装

Fmpeg地址

FFmpeg源码地址:https://github.com/FFmpeg/FFmpeg

FFmpeg可执行文件地址:https://ffmpeg.org/download.html

Windows平台

Windows平台下载解压后如图所示(文件名称以-share结尾的是开发库)

FFmpeg库介绍

◆ ffmpeg.exe:用于音视频转码, 也可以从url/现场音频/视频源抓取输入源。

◆ ffplay.exe:一个非常简单和可移植的媒体播放器,使用FFmpeg库和SDL库。

◆ ffprobe.exe:查看多媒体文件的信息

将FFmpeg可执行文件加入系统环境变量,如下图所示:

Linux

ffmpeg官方 GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git

下载压缩包 或者 直接clone

  1. 直接clone:git clone https://github.com/FFmpeg/FFmpeg.git
  2. 下载完成,执行./configure

        如果出现了错误 nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

        这是因为 FFMPEG为了提高编译速度,使用了汇编指令,如MMX和SSE等。如果系统中没有yasm指令的话,就会该错误。

        1)下载:wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

        2)解压:tar zxvf yasm-1.3.0.tar.gz

        3)切换路径: cd yasm-1.3.0

        4)执行配置: ./configure

        5)编译:make

        6)安装:make install

3.make && sudo make install 

测试代码:

#include<stdio.h>
#include<libavutil/log.h>


int main()
{
	av_log_set_level(AV_LOG_DEBUG);            //设置日志等级
	av_log(NULL, AV_LOG_INFO, "Hello~~~\n");       // INFO等级,输出hello

	return 0;
}

 编译链接: gcc -o ff_log ff_log.c -lavutil
        或者 gcc -o ff_log ff_log.c `pkg-config --cflags --libs libavutil`

(“pkg-config工具:1)会检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件;2)会获得编译预处理参数,如宏定义,头文件的位置。3)还会获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数

        选项--cflags 它是用来指定程序在编译时所需要头文件所在的目录, 选项 --libs则是指定程序在链接时所需要的动态链接库的目录。

ffmpeg——log日志系统

log日志位于libavutil模块,log level的声明位于log.h

日志级别:

// 静默模式,不打印日志
#define AV_LOG_QUIET    -8
 
// 立即崩溃,退出程序
#define AV_LOG_PANIC     0
 
// 严重出错,无法修复
#define AV_LOG_FATAL     8
 
// 程序出错
#define AV_LOG_ERROR    16
 
// 警告
#define AV_LOG_WARNING  24
 
// 信息
#define AV_LOG_INFO     32
 
// 详细信息
#define AV_LOG_VERBOSE  40
 
// 调试日志
#define AV_LOG_DEBUG    48
 
// 跟踪日志
#define AV_LOG_TRACE    56

设置日志等级的方法set_log_level()位于log.c,其中av_log_level是个静态全局变量,具体如下

static int av_log_level = AV_LOG_INFO;
 
void av_log_set_level(int level)
{
    av_log_level = level;
}

常用的打印日志方法av_log(),声明位于log.h:

/** 
 * 发送特定消息到小于等于当前等级的日志,默认全部发送到stderr
 *
 * @param avcl  指向任意结构体的指针,结构体第一个变量为AVClass或NULL
 * @param level 日志等级
 * @param fmt   字符串格式
 */
void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);

ffmpeg——文件的删除与重命名 

  • avpriv_io_delete() //删除
  • avpriv_io_move()  //重命名

编译链接: gcc xxx.c -o xxx   -lavformat -lavutil

#include <libavformat/avformat.h>
 
int main(int argc,char *argv[])
{
        int ret;
        set_av_log_level(AV_LOG_DEBUG);
        ret = avpriv_io_move("111.txt","222.txt");
        if(ret < 0)
        {
                av_log(NULL,AV_LOG_ERROR,"Failed to move file:%s\n","111.txt");
                return -1;
        }
 
        

        ret = avpriv_io_delete("./mytestfile.txt");
        if(ret < 0)
        {
                av_log(NULL,AV_LOG_ERROR,"Failed to delete file:%s\n","mytestfile.txt");
                return -1;
        }
 
        av_log(NULL,AV_LOG_DEBUG,"Success to delete file:%s\n","mytestfile.txt");
 
        return 0;
}

ffmpeg——目录操作

重要结构体:

        AVIODirContext  操作目录的上下文(记录avio_open_dir打开目录信息)

        AVIODirEntry  目录项。用于存放文件名,文件大小等信息

操作目录API:

  • avio_open_dir()
  • avio_read_dir()//读取目录中每一个文件的属性
  • avio_close_dir()

编译链接: gcc xxx.c -o xxx   -lavformat -lavutil

// 实现简单的ls命令

#include <libavutil/log.h>
#include <libavformat/avformat.h>
 
int main(int argc,char* argv[])
{
        int ret;
        AVIODirContext *ctx = NULL;
        AVIODirEntry *entry = NULL;
        av_log_set_level(AV_LOG_INFO);
 
        ret = avio_open_dir(&ctx,"./",NULL);
        if(ret < 0){
                av_log(NULL,AV_LOG_ERROR,"Cant open dir:%s\n",av_err2str(ret));
                return -1;
        }
 
        while(1){
                ret = avio_read_dir(ctx,&entry);//malloc entry
                if(ret < 0){
                        av_log(NULL,AV_LOG_ERROR,"Cant read dir:%s\n",av_err2str(ret));
                        avio_close_dir(&ctx);
                        return -1;
                }
                if(!entry){
                        //the end
                        break;
                }
 
                av_log(NULL,AV_LOG_INFO,"%12"PRId64" %s\n",
                        entry->size,
                        entry->name);
 
                avio_free_directory_entry(&entry);//free entry
        }
 
        avio_close_dir(&ctx);
        return 0;
}

ffmpeg——多媒体文件

        多媒体文件是一个容器(也可以理解为包装盒,常见的mp4、flv、mkv都是不同的包装盒 ),可以存放很多数据,最常见的有字幕数据、视频数据、音频数据。

        在容器中有很多流(Stream/Track),流媒体文件中不同的流之数据不会相交的,比如音频流和视频流就是各自独立的。

        每种流是由不同的编码器编码的,每条流数据在多媒体文件中是经过压缩的,但是其使用压缩的编码器都是不一样的。比如音频有可能是MP3,有可能是AAC,视频常见的压缩器有可能是H264或者H265。

        从流中读出的数据称为包,在一个包中包含着一个或者多个帧。

重要的结构体

  • AVFormatContext     //格式上下文(记录打开多媒体文件的信息,多个API桥梁作用)
  • AVStream               // 流
  • AVPacket                //   包    

ffmpeg操作流数据的基本步骤:

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

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

相关文章

当面试官的一些想法

前天被同事拉去面试了&#xff0c;一天面试很多人&#xff0c;很是疲惫。之前在小米的5年&#xff0c;也总是被组长拉去当面试官。虽然我个人已经对这种事很厌倦了&#xff0c;但在面试过程中获得的一些收获还是不错的。今天也就从面试官的角度来给一些小建议。 事先声明哈&…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

单输入多输出(SIMO)和多输入多输出(MIMO)模型

我列举了一些单输入多输出&#xff08;SIMO&#xff09;和多输入多输出&#xff08;MIMO&#xff09;模型的例子&#xff1a; 单输入多输出&#xff08;SIMO&#xff09;模型&#xff1a; 股票价格预测&#xff1a;在这个例子中&#xff0c;输入可能是某只股票的历史价格数据…

武汉星起航:自运营团队力创佳绩,年流水千万展跨境新高度

在风起云涌的跨境电商领域中&#xff0c;武汉星起航电子商务有限公司凭借其卓越的自运营能力&#xff0c;成为一颗璀璨的明星。而这背后&#xff0c;离不开一支专业性极强、拥有多年自运营经验的团队。他们凭借深厚的行业积累与不懈的拼搏精神&#xff0c;成功在亚马逊平台上打…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

比较鸿蒙应用中MVVM与MVP模式在处理数据流、响应用户事件以及职责划分上的异同?

鸿蒙应用中MVVM与MVP模式的异同比较&#xff1a; 数据流处理&#xff1a; MVVM&#xff1a; 数据流从Model流向ViewModel&#xff0c;通过数据绑定机制&#xff08;如ObservableField、LiveData等&#xff09;自动同步到View。ViewModel持有Model的引用&#xff0c;监听数据变…

图深度学习——1.介绍

1、介绍 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对在某种意义上是“相关的”&#xff08;存在某种关系&#xff09;。这些对象对应于称为顶点的数学抽象&#xff08;也称为节点或点&#xff09;&#xff0c;并且每个相关的顶点对都称为边&…

视频批量采集下载爬取软件|短视频爬虫提取工具

轻松获取视频&#xff01;视频批量下载神器问世 在日常工作中&#xff0c;我们经常需要大量的视频资源来支持各种需求&#xff0c;但传统的获取方式通常耗时费力&#xff0c;一个一个复制链接下载实在效率太低。为了解决这一难题&#xff0c;我们自主研发了一款强大的短视频批…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述…

flex上下固定中间占固定高度(中间左右菜单)且内容自动滚动

效果图 布局&#xff1a; <view class"pop_tSet"><view class"pop_Con"><view class"box_bb"><view class"bb_title">{{titleObj[popType]}}</view></view><view class"box_bb_bot"…

固体矿产资源储量分类GBT17766-2020

1999分类标准采用三轴体系划分资源量与处理&#xff0c;表达复杂、经济意义划分过细、实用性不强 虽然不再采用”三轴“表达方式&#xff0c;但依然考虑地质可靠程度、经济意义、可行性评价 矿产资源勘查&#xff1a;通常依靠地球科学知识&#xff0c;运用地质填图&#xff0…

8条指南教你设计奶油风客厅。福州中宅装饰,福州装修

作为一名专业的设计师&#xff0c;我将为您带来一些关于奶油风客厅设计的干货。奶油风是一种温馨、柔和的装修风格&#xff0c;以下是一些设计指南&#xff0c;帮助您打造一个舒适而美丽的奶油风客厅。 1. 色彩搭配 除了米色、浅黄色和淡粉色等基础色调&#xff0c;还可以尝试…

Python程序设计 二维列表(二)

实验九 二维列表 1. 血压统计 血压的正常范围是 60mmHg<舒张压<90mmHg 90mmHg<收缩压<140mmHg 输入小张测量血压的日期&#xff0c;舒张压和收缩压&#xff0c;存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期&#xff0c;舒张…

Vscode | Python | launch.json配置gevent多进程断点失效问题处理

Vscode | Python | launch.json配置gevent多进程断点失效问题处理 文章目录 情况描述↓↓↓解决办法直接看这里↓↓↓ 情况描述 launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more i…

MATLAB中gurobi 运行报错与调试

问题背景如下&#xff1a;刚拿到一份MATLAB的代码&#xff0c;但是电脑第一次安装gurobi&#xff0c;在运行过程中发生了报错&#xff0c;使用断点进行调试和步进调试方法&#xff0c;最终发现&#xff0c;这个问题出在了哪一步&#xff0c;然后向了人工智能和CSDN、百度寻求答…

以时分秒为单位累计设备运行时间功能块(SMART PLC梯形图代码)

1、SMART PLC设备累计运行时间功能块 SMART PLC设备累计运行时间功能块_plc计算累计时间-CSDN博客文章浏览阅读765次。PLC FC 、FB、子程序、函数学习笔记_RXXW_Dor的博客-CSDN博客FC、 FB、 子程序&#xff0c;&#xff08;甚至包括一些指令&#xff09;这些称呼其实并没有本…

MySQL中InnoDB存储引擎详细介绍

介绍 InnoDB是一种兼顾高可靠性高和高性能的通用存储引擎&#xff0c;在MySQL5.5之后&#xff0c;InnoDB是默认的MySQL存储引擎。 特点 DML(增删改)操作遵循ACID(事务四大特性)模型&#xff0c;支持事务&#xff1b;行级锁&#xff0c;提高并发访问性能支持外链FORELGN KEY约…

Linux 认识与学习Bash——1

在Linux系统中&#xff0c;有多种命令和技巧可以帮助用户与shell交互、管理变量以及执行命令。以下是对您提供的信息的简化和概述&#xff1a; 命令查找和信息 which&#xff1a;查找系统路径中的命令位置。whereis&#xff1a;查找命令的二进制文件、源代码和手册页。type&a…

c++二分排序(向右

描述 给出有 n 个元素的由小到大的序列&#xff0c;请你编程找出某元素最后一次出现的位置。 (n<10^6 输入描述 第一行&#xff1a;一个整数&#xff0c;表示由小到大序列元素个数&#xff1b;下面 n 行&#xff0c;每行一个整数&#xff1b; 最后一行 一个整数 x&#x…

05_数组和结构体

结构体 结构体的使用(重点) 结构体值传参 传值是指将参数的值拷贝一份传递给函数&#xff0c;函数内部对该参数的修改不会影响到原来的变量 结构体地址传递 传址是指将参数的地址传递给函数&#xff0c;函数内部可以通过该地址来访问原变量&#xff0c;并对其进行修改。…