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.rhkb.cn/news/361865.html

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

相关文章

基于Java技术的在线学习平台系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;基于SpringBoot框架 工具&#xff1a;Eclipse、Navicat、M…

【ocean】ocnPrin结合getData导出数据

核心就是这一句ocnPrint(?output fout leafValue( getData(“/output” ?result “dc”))) r_list list(4000, 4100, 4200) multi_list list(20,21,22) fout outfile("/home/yourpath/results.txt" "w") foreach(r_value r_listforeach(multi_value …

Redis数据库(六):主从复制和缓存穿透及雪崩

目录 一、Redis主从复制 1.1 概念 1.2 主从复制的作用 1.3 实现一主二从 1.4 哨兵模式 1.4.1 哨兵的作用 1.4.2 哨兵模式的优缺点 二、Redis缓存穿透和雪崩 2.1 缓存穿透——查不到 2.1.1 缓存穿透解决办法 2.2 缓存击穿 - 量太大&#xff0c;缓存过期 2.2.1 缓存…

高频面试题基本总结回顾2(含笔试高频算法整理)

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

如何快速解决验证码图像问题 | 最佳图像(OCR)验证码解决工具

你是否曾经遇到过陷入一个看似无尽的 CAPTCHA 挑战中&#xff0c;努力识别扭曲的字符或数字&#xff1f;这些令人抓狂的 CAPTCHA 是为了确保你是人类而不是机器人&#xff0c;但它们也给真正的用户带来了头痛。那么&#xff0c;有没有快速解决这些 CAPTCHA 图像的方法&#xff…

Vue-Ci搭建项目

项目创建 vue-cli 官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 主要的功能 ● 统一的目录结构 ● 本地调试 热部署 ● 单元…

华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

设备驱动框架之LED

文章目录 前言一、什么是驱动框架二、使用步骤1.注册LED设备2.卸载LED设备3.内核中申请内存4.container_of5.platform_get_drvdata 和 platform_set_drvdata6.module_platform_driver 三、驱动示例总结 前言 为了尽量降低驱动开发者难度以及接口标准化&#xff0c;就出现了设备…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维修…

数据库原理之数据库基本概念

目录 前言 基本概念 数据库完整性 前言 今天我们来看看数据库的基本概念&#xff0c;帮助大家对数据库有一点点最基本的了解 基本概念 4个基本概念 数据data&#xff1a;描述事物的符号&#xff0c;数据库中存储的基本对象。 数据库Database&#xff1a;长期存储在计算机…

基于JSP技术的旅游网站系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;B/S架构&#xff0c;JSP技术 工具&#xff1a;Eclipse&#xff0c;Tomcat…

PostMan动态设置全局变量

1. 前言 在开发过程中调试接口&#xff0c;一般都会使用PostMan。 其中有几个变量可能是好几个接口共用的&#xff0c;就会出现频繁手动复制(ctrlc)、粘贴(ctrlv)的情况。 这个过程得非常留意&#xff0c;生怕复制错了&#xff0c;或删减了某些东西&#xff0c;导致接口报错。…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中&#xff0c;强度&#xff08;Intensity&#xff09;指的是激光雷达传感器在扫描环境时&#xff0c;每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了&#xff0c;然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步&#xff1a;找到stiffness参数&#xff0c;右键expression->edit expre…

基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

第一步&#xff1a;准备数据 12种宠物猫类数据&#xff1a;self.class_indict ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫&q…

【uni-app学习手札】

uni-app&#xff08;vue3&#xff09;编写微信小程序 编写uni-app不必拘泥于HBuilder-X编辑器&#xff0c;可用vscode进行编写&#xff0c;在《微信开发者工具》中进行热加载预览&#xff0c; 主要记录使用uni-app过程中自我备忘一些api跟语法&#xff0c;方便以后编写查找使用…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而&#xff0c;检索器很难捕捉相关性&#xff0c;尤…

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下&#xff0c;我的电脑连接的是无线网络&#xff0c;开发板和电脑是用网线进行连接的…

ComfyUI如何使用Face Detailer和ComfyI2I插件进行修脸

一.插件ComfyI2I使用 1.ComfyUI中调用Mask Ops 2.创建蒙版插件BBOX Detector(combined) 3.创建UltralyticsDetectorProvider 里面包含多个模型其中bbox/face_yolov8m.pt是针对脸部修复 4.组合后测试脸部蒙版识别是否正常 5.测试正常后调出Inpaint Segments&#xff0c;放大…

作 业 二

cs与msf权限传递 1、进入cs界面,首先来到 Cobalt Strike 目录下&#xff0c;启动 Cobalt Strike 服务端 2、用客户端进 3、建立监听 4、生成脚本文件 5、开启服务&#xff0c;让win_2012 下载木马文件并运行 6、显示已经获取到了win的权限 转到Metasploit Framework 7、进去m…