ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作

文章目录

    • FFMPEG
    • 1. 操作日志
    • 2. 文件移动和删除
    • 3. 操作目录重要函数

FFMPEG

1. 操作日志

  • 日志级别

AV LOG ERROR
AV LOG WARNING
AV LOG INFO
AV LOG DEBUG

cmake_minimum_required(VERSION 3.27)
project(FFmpeg_exercise)
set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路径变量
set(FFMPEG_INSTALL_DIR "/usr/local/ffmpeg")# 将FFmpeg的头文件目录添加到包含路径
include_directories(${FFMPEG_INSTALL_DIR}/include)# 定义FFmpeg库的基础名称(根据你的需要调整)
set(FFMPEG_LIBS "avcodec;avformat;avutil") # 用分号分隔库名# 寻找并链接FFmpeg库
foreach(FFMPEG_LIB ${FFMPEG_LIBS})find_library(${FFMPEG_LIB}_LIBRARY NAMES ${FFMPEG_LIB}PATHS ${FFMPEG_INSTALL_DIR}/lib NO_DEFAULT_PATH)list(APPEND FFMPEG_LIBRARIES ${${FFMPEG_LIB}_LIBRARY})
endforeach()add_executable(FFmpeg_exercise main.cpp)
# 链接FFmpeg库
target_link_libraries(FFmpeg_exercise ${FFMPEG_LIBRARIES})
  • main.cpp

#ifdef __cplusplus
extern "C" {
#endif// 包含FFmpeg的头文件#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libavutil/avutil.h>
#ifdef __cplusplus}
#endif
/*通过预处理器指令#ifdef __cplusplus来检查代码是否在C++环境中编译。如果是,它将开始一个extern "C"块,这意味着在该块内包含的代码将使用C的链接规则。这通常用于包含C库的头文件,以确保C++编译器不会对函数名进行名称修饰。
*/
int main() {av_log_set_level(AV_LOG_DEBUG);av_log(nullptr,AV_LOG_DEBUG,"Hello World!:%d\n",10);av_log(nullptr,AV_LOG_INFO,"Hello World! test: INFO\n");av_log(nullptr,AV_LOG_ERROR,"Hello World! test: ERROR\n");return 0;
}

image-20240621212832462

2. 文件移动和删除

  • api

avpriv_io_delete(): 删除
avpriv_io_move():移动

  • 案例

cmake_minimum_required(VERSION 3.27)
project(FFmpeg_exercise)
set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路径变量
set(FFMPEG_INSTALL_DIR "/usr/local/ffmpeg")# 将FFmpeg的头文件目录添加到包含路径
include_directories(${FFMPEG_INSTALL_DIR}/include)# 定义FFmpeg库的基础名称(根据你的需要调整)
set(FFMPEG_LIBS "avcodec;avformat;avutil") # 用分号分隔库名# 寻找并链接FFmpeg库
foreach(FFMPEG_LIB ${FFMPEG_LIBS})find_library(${FFMPEG_LIB}_LIBRARY NAMES ${FFMPEG_LIB}PATHS ${FFMPEG_INSTALL_DIR}/lib NO_DEFAULT_PATH)list(APPEND FFMPEG_LIBRARIES ${${FFMPEG_LIB}_LIBRARY})
endforeach()add_executable(FFmpeg_exercise main.cpp)
# 链接FFmpeg库
target_link_libraries(FFmpeg_exercise ${FFMPEG_LIBRARIES})

#ifdef __cplusplus
extern "C" {
#endif// 包含FFmpeg的头文件#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libavutil/avutil.h>
#ifdef __cplusplus}
#endif
#include <iostream>
#include <fstream>
/*通过预处理器指令#ifdef __cplusplus来检查代码是否在C++环境中编译。如果是,它将开始一个extern "C"块,这意味着在该块内包含的代码将使用C的链接规则。这通常用于包含C库的头文件,以确保C++编译器不会对函数名进行名称修饰。
*/
int main() {std::ofstream outfile("./test.txt");outfile<<"hello world!\n"<<std::endl;outfile<<"this is a test file"<<std::endl;outfile.close();if (outfile.is_open()) {av_log(nullptr,AV_LOG_ERROR,"Failed to close file: %s","./test.txt");return 1; // 如果文件未关闭,返回错误代码}av_log_set_level(AV_LOG_DEBUG);int ret {0};ret = avpriv_io_move("./test.txt","./demo.txt");if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to rename text.txt\n");}av_log(nullptr,AV_LOG_INFO,"SUCCESSED TO RENAME FILE TEXT.TXT\n");ret = avpriv_io_delete("./demo.txt");if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to delete demo.txt\n");}av_log(nullptr,AV_LOG_INFO,"SUCCESSED TO delete FILE TEXT.TXT\n");//    av_log(nullptr,AV_LOG_DEBUG,"Hello World!:%d\n",10);//    av_log(nullptr,AV_LOG_INFO,"Hello World! test: INFO\n");//    av_log(nullptr,AV_LOG_ERROR,"Hello World! test: ERROR\n");return 0;
}

image-20240621222021634

3. 操作目录重要函数

  1. avio_open_dir():

    • 功能:打开一个目录以供进一步读取。
    • 返回值:成功时返回指向AVIODirContext的指针,失败时返回NULL
    • 使用:此函数用于初始化目录遍历,获取指向目录中第一个条目的指针。
  2. AVIODirContext:

    • 类型:这是一个不透明的结构体,用于表示打开的目录和遍历状态。
    • 用途:在使用avio_open_dir()成功打开目录后,会返回一个AVIODirContext类型的指针,该指针在后续的目录遍历中使用。
  3. avio_read_dir():

    • 功能:读取目录中的下一个条目。
    • 参数:传入AVIODirContext指针。
    • 返回值:成功时返回指向AVIoDirEntry的指针,遍历完成或失败时返回NULL
    • 使用:在每次调用avio_read_dir()后,都会移动到目录中的下一个条目。如果已经到达目录末尾或发生错误,则返回NULL
  4. AVIoDirEntry:

    • 类型:这是一个结构体,包含有关目录条目的信息,如文件名、文件类型等。
    • 用途:通过avio_read_dir()获取的每个条目都是一个AVIoDirEntry对象,它包含了关于文件或目录的信息。
  5. avio_close_dir():

    • 功能:关闭之前用avio_open_dir()打开的目录。
    • 参数:传入AVIODirContext指针。
    • 返回值:返回0表示成功,返回负数表示失败。
    • 使用:完成目录遍历后,应当调用此函数来释放与AVIODirContext关联的资源。
  • 案例

#ifdef __cplusplus
extern "C" {
#endif
// 包含FFmpeg的头文件
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#ifdef __cplusplus}
#endif
#include <iostream>
#include <fstream>
/*通过预处理器指令#ifdef __cplusplus来检查代码是否在C++环境中编译。如果是,它将开始一个extern "C"块,这意味着在该块内包含的代码将使用C的链接规则。这通常用于包含C库的头文件,以确保C++编译器不会对函数名进行名称修饰。
*/
int main() {int ret {0};//# 上下文结构体AVIODirContext *ctx {nullptr};AVIODirEntry *entry {nullptr};ret = avio_open_dir(&ctx,"./", nullptr);if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to open dir:%s\n", av_err2str(ret));goto _fail;;} else{av_log(nullptr,AV_LOG_INFO,"Success to open dir:%s\n", av_err2str(ret));}while(true){// 读取文件ret = avio_read_dir(ctx,&entry);if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to read dir:%s\n", av_err2str(ret));return -1;} else{av_log(nullptr,AV_LOG_INFO,"Success to read dir:%s\n", av_err2str(ret));}if(!entry){break;}av_log(nullptr,AV_LOG_INFO,"%lld PRID64%s\n",entry->size,entry->name);// 释放内存,防止内存泄漏avio_free_directory_entry(&entry);}_fail:avio_close_dir(&ctx);std::ofstream outfile("./test.txt");outfile<<"hello world!\n"<<std::endl;outfile<<"this is a test file"<<std::endl;outfile.close();if (outfile.is_open()) {av_log(nullptr,AV_LOG_ERROR,"Failed to close file: %s","./test.txt");return 1; // 如果文件未关闭,返回错误代码}av_log_set_level(AV_LOG_DEBUG);ret = avpriv_io_move("./test.txt","./demo.txt");if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to rename text.txt\n");}av_log(nullptr,AV_LOG_INFO,"SUCCESSED TO RENAME FILE TEXT.TXT\n");ret = avpriv_io_delete("./demo.txt");if (ret<0){av_log(nullptr,AV_LOG_ERROR,"Failed to delete demo.txt\n");}av_log(nullptr,AV_LOG_INFO,"SUCCESSED TO delete FILE TEXT.TXT\n");//    av_log(nullptr,AV_LOG_DEBUG,"Hello World!:%d\n",10);//    av_log(nullptr,AV_LOG_INFO,"Hello World! test: INFO\n");//    av_log(nullptr,AV_LOG_ERROR,"Hello World! test: ERROR\n");return 0;
}

image-20240622093515869

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

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

相关文章

转--Hadoop集群部署案例

模块简介 本模块主要练习Hadoop集群部署。 模块知识 ● 使用Linux基础命令 ● Hadoop集群搭建部署知识 环境准备 三台CentOS7操作系统的虚拟机 可以是3个Docker容器&#xff0c;也可以是三个VMWare/VirtualBox的虚拟机。三台虚拟机的最低配置为1核1G 20G。如果是虚拟机中…

MK米客方德SD NAND的掉电保护机制

随着科技的飞速发展&#xff0c;数据存储设备在我们的生活和工作中扮演着越来越重要的角色。然而&#xff0c;数据安全问题也随之而来&#xff0c;尤其是面对突然的电源故障或意外断电&#xff0c;我们宝贵的数据可能会面临丢失的风险。MK米客方德公司深知这一点&#xff0c;因…

Linux中tar压缩与解压缩

TAR是Unix/Linux中常用的归档工具&#xff0c;它可以对文件或目录进行打包但不压缩&#xff0c;或者配合其他工具进行压缩。 压缩文件或目录 以下是一些基本的tar压缩命令&#xff1a; 1.压缩单个文件&#xff1a; tar -cvf archive.tar file1 2.压缩多个文件&#xff1a; t…

导入别人的net文件报红问题

1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本 2.直接找到项目中的 global.json 文件&#xff0c;右键打开&#xff0c;直接修改版本为本机的SDK版本&#xff0c;就可以用了

CPU飙升100%怎么办?字节跳动面试官告诉你答案!

小北说在前面 CPU占用率突然飙升是技术人员常遇到的一个棘手问题&#xff0c;它是一个与具体技术无关的普遍挑战。 这个问题可以很简单&#xff0c;也可以相当复杂。 有时候&#xff0c;只是一个死循环在作祟。 有时候&#xff0c;是死锁导致的。 有时候&#xff0c;代码中有…

windows设置开机启动项

将文件放到下面路径即可实现每次开机启动 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

【最新】2025QS世界大学排名数据与得分明细数据集

数据简介&#xff1a;QS排名由Quacquarelli Symonds公司发布&#xff0c;是全球最具影响力的大学排名之一。它每年根据学术声誉、雇主声誉、师生比例、文献引用率、国际师资和国际学生比例等多项指标&#xff0c;对全球大学进行评估和排序。旨在为学生、学者和雇主提供权威的高…

如何使用小猪APP分发进行在线封装

什么是在线封装&#xff1f; 在线封装&#xff0c;顾名思义&#xff0c;就是通过网络将应用程序进行打包处理。这个过程不仅能节省时间&#xff0c;还能大大提升工作效率&#xff0c;让开发者专注于应用本身的优化。 小猪app封装www.ppzhu.net 为什么选择小猪APP分发&#xf…

YOLOv8改进 | SPPF | 双通道特征处理的池化结构——SPPFCSPC【全网独家】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

java干货,spring声明式事务

文章目录 一、编程式事务1.1 什么是编程式事务1.2 编程式事务的优缺点 二、声明式事务2.1 什么是声明式事务2.2 声明式事务的优点2.3 Spring 事务管理器2.4 spring 声明式事务使用 一、编程式事务 1.1 什么是编程式事务 编程式事务是指通过手动编写程序来管理事务&#xff0c…

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人&#xff0c;内部搭载ICD系列核心控制器&#xff0c;拥有不同的移载平台&#xff0c;负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游&#xff0c;实现更稳健的网络数据交互;无轨化激光 SLAM 导航&#xff0c;配合 3D 避障相机…

CompletableFuture 基本用法

一、 CompletableFuture简介 CompletableFuture 是 Java 8 引入的一个功能强大的类&#xff0c;用于异步编程和并发处理。它提供了丰富的 API 来处理异步任务的结果&#xff0c;支持函数式编程风格&#xff0c;并允许通过链式调用组合多个异步操作。 二、CompletableFuture中…

通用大模型的低代码平台——3分钟内快速搭建一个邮件提醒工具

文章目录 ⭐前言⭐node-koa开发一个发送邮件的api⭐百度智能云控制面板&#x1f496; 发送邮件的组件配置&#x1f496; 配置应用发布 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;通用大模型的低代码平台——3分钟内快速搭建一个智能股票分析邮件提醒工具。…

Linux环境搭建之CentOS7(包含静态IP配置)

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;虚拟机 &#x1f320; 首发时间&#xff1a;2024年6月22日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 安装VMw…

SD卡无法读取?原因分析与数据恢复策略

一、SD卡无法读取的困境 SD卡作为便携式的存储介质&#xff0c;广泛应用于手机、相机、平板等多种电子设备中。然而&#xff0c;在使用过程中&#xff0c;我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时&#xff0c;设备无法识别SD卡&#xff0c;或者虽然识别了SD…

投资者回归理性?美股去年备受追捧的AI概念股,今年超过一半在下跌

喊两句AI就能圈钱的日子一去不复返了&#xff0c;未来企业要用实打实的业绩说话。 正文 去年备受追捧的AI概念股中&#xff0c;今年绝大多数已经开始下跌。面对越来越谨慎的投资者&#xff0c; 上市公司或许很难再打着AI的旗号圈钱。 今年&#xff0c;标普500指数中有60%的股…

教大家封装一个基础el-table 行内气泡编辑框,你一定用的到

今天的任务就是封装这个用element ui 组件来封装,如果让你封装你会怎么封装呢? 不说废话了,直接上代码 新建一个EditablePopoverColumn.vue组件文件 <template><el-table-column :prop="prop" :label="label"><template slot-scope=&…

和琪宝的厦门之旅~

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 承接去年国庆的遗憾&#xff0c;我们将这次的旅行城市定为厦门。 琪宝是下午四点左右到…

机器学习课程复习——支持向量机

支持向量机是一种二类分类模型。基本模型:定义在特征空间上的间隔最大的线性分类器模型升级:线性分类器+核技巧=非线性分类器学习策略:间隔最大化(可形式化为求解凸二次规划的问题;可等价于正则化的合页损失函数的最小化问题)学习算法:求解图二次规划的最优化算法支持向…

C语言程序设计-2 程序的灵魂—算法

【例 2.1】求 12345。 最原始方法&#xff1a; 步骤 1&#xff1a;先求 12&#xff0c;得到结果 2。 步骤 2&#xff1a;将步骤 1 得到的乘积 2 乘以 3&#xff0c;得到结果 6。 步骤 3&#xff1a;将 6 再乘以 4&#xff0c;得 24。 步骤 4&#xff1a;将 24 再乘以 5&#xf…