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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

冲击2024年CSDN博客之星TOP1:CSDN文章质量分查询在哪里?

文章目录 一&#xff0c;2023年博客之星规则1&#xff0c;不高的入围门槛2&#xff0c;[CSDN博文质量分测评地址](https://www.csdn.net/qc) 二&#xff0c;高分秘籍1&#xff0c;要有目录2&#xff0c;文章长度要足够&#xff0c;我的经验是汉字加代码至少1000字。3&#xff0…

一个漂亮的网站收藏函数

<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>网站收藏</title><style>body …

function包装器和bind包装器

function包装器和bind包装器 包装器function包装器为什么需要functionfunction包装器function包装器的应用场景逆波兰表达式求值 bind包装器bind包装器的应用场景 包装器 包装器是用于给其他编程接口提供更一致或更合适的接口 由于函数调用可以使用函数名、函数指针、函数对象…

MSPM0G3507——PWM

在sysconfig中&#xff0c;左侧可以选择MCU的外设&#xff0c;我们找到并点击TIMER-PWM选项卡&#xff0c;在TIMER-PWM中点击ADD&#xff0c;就可以添加定时器下的PWM外设。 这里设置通道0为100Hz的频率&#xff0c;0%占空比的PWM&#xff0c;周期计数值为1000&#xff0c;比较…

Linux中的文本编辑器vi与vim

摘要&#xff1a; 本文将深入探讨VI和VIM编辑器的基本概念、特点、使用方法以及它们在Linux环境中的重要性。通过对这两款强大的文本编辑器的详细分析&#xff0c;读者将能够更全面地理解它们的功能&#xff0c;并掌握如何有效地使用它们进行日常的文本编辑和处理任务。 引言&…

标准立项 | 《温室气体排放核算与报告要求 废油资源化企业》

《温室气体排放核算与报告要求 废油资源化企业》适用于废油资源化行业企业温室气体排放量的核算和报告。从事废油资源化生产的企业&#xff0c;均可参考该标准核算企业的温室气体排放量&#xff0c;并编制企业温室气体排放报告。 参编咨询&#xff1a;中华环保联合会水环境治理…

新火种AI|Claude 3.5一夜封王超越GPT-4o!留给OpenAI的时间真的不多了...

AI大模型更新换代的速度&#xff0c;的确快到令人难以想象。 相信很多人现在对“最先进AI大模型”的印象还停留在GPT-4&#xff0c;但事实上&#xff0c;大模型领域的头把交椅早已悄然易主了好几回。就在GPT-4惊艳全球不久之后&#xff0c;其“死对头” Anthropic发布了Claude…

2024/6/22 英语每日一段

France is the only country in Europe with an EPR that covers the textile industry. Critics say the policy does little for “end-of-line” countries such as Ghana because the fee paid by clothing producers is low at just €0.06 for each item, and the funds …

8_机械臂工作台坐标系标定及验证

1、机械臂实际数据 AUBO 机械臂xOxy方式标定用户坐标系&#xff1a; O: X轴正半轴一点&#xff1a; XOY象限任意一点(还是有一些要求的): 一些坐标点的验证&#xff1a; 2、如何根据上述3点&#xff0c;计算work1坐标系与base坐标系的关系&#xff1f; 最开始在网上没找到相关的…

90V转12V1A恒压WT6039

90V转12V1A恒压WT6039 WT6039降压DC-DC转换器芯片专为处理宽泛的电压输入范围设计&#xff0c;支持从12V至90V。该芯片集成了关键功能&#xff0c;如使能控制开关、参考电源、误差放大器、过热保护、限流保护及短路保护等&#xff0c;以确保系统在各种操作条件下的安全与稳定性…

【朝花夕拾】RT1170 CSI 如何使能摄像头Y8功能

【朝花夕拾】RT1170 CSI 如何使能摄像头Y8功能 一&#xff0c;文档简介二&#xff0c;RT1170 CSI Y8黑白格式配置与测试2.1 软硬件情况2.2 Y8黑白格式的具体配置2.3 测试结果 一&#xff0c;文档简介 RT1170的CSI可以支持YUV格式&#xff0c;所谓的YUV分为三个分量&#xff1a…

xocde编辑器支持修改为中文吗?不支持

xocde编辑器支持修改为中文吗&#xff1f; 不支持

储能电池竞争出海分析

锂电池的激烈竞争进一步蔓延到储能行业。为保市场份额和现金流稳定&#xff0c;不少储能电池企业都开始大幅度降低报价只求中标储能项目。 随着6月的储能电芯的最高限价和系统报价都已经贴近成本价&#xff0c;一二三线的储能电池厂商将要如何应对&#xff1f; 1、储能规模快速…

Redis进阶 - Redis 淘汰策略

我们知道Redis是分布式内存数据库&#xff0c;基于内存运行&#xff0c;可是有没有想过比较好的服务器内存也不过几百G&#xff0c;能存多少数据呢&#xff0c;当内存占用满了之后该怎么办呢&#xff1f;Redis的内存是否可以设置限制&#xff1f; 过期的key是怎么从内存中删除的…

重学java 80.Junit单元测试

我总是着急的解释我自己&#xff0c;却忘了厚爱无需多言 —— 24.6.21 一、Junit介绍 1.概述 Junit是一个单元测试框架,可以代替main方法去执行其他的方法 2.作用 可以单独执行一个方法,测试该方法是否能跑通 3.注意 Junit是第三方工具,所以使用之前需要导入jar包 二、J…

1.SG90

目录 一.实物图 二.原理图 三.简介 四.工作原理 一.实物图 二.原理图 三.简介 舵机&#xff08;英文叫Servo&#xff09;&#xff0c;是伺服电机的一种&#xff0c;伺服电机就是带有反馈环节的电机&#xff0c;这种电机可以进行精确的位置控制或者输出较高的扭矩。舵机…

在线二维码解码器:将二维码转换成网址链接

在当今数字化时代&#xff0c;二维码&#xff08;QR码&#xff09;已成为一种便捷的信息传递工具。它不仅可以存储大量数据&#xff0c;还能快速分享信息。然而&#xff0c;有时我们需要将二维码中的内容转换为网址链接&#xff0c;以便在浏览器中直接访问。小编将详细介绍如何…

关于jupyter notebook的使用经验

jupyter notebook 第一点&#xff0c;调整每次打开jupyter notebook的时候的位置第二点&#xff0c;如何设置jupyter notebook可以使用本地anaconda创建的虚拟环境呢&#xff1f;第三点&#xff0c;使用jupyter notebook的技巧 以下三点都是独立的&#xff0c;可以根据自己的需…

【Gradio】构建自定义多模态聊天机器人

这是我们构建自定义多模态聊天机器人组件两部分系列的第一部分。在第一部分中&#xff0c;我们将修改 Gradio 聊天机器人组件&#xff0c;使其能够在同一消息中显示文本和媒体文件&#xff08;视频、音频、图片&#xff09;。在第二部分中&#xff0c;我们将构建一个自定义的文…

3D视觉引导机器人提升生产线的自动化水平和智能化程度

随着智能化技术的不断发展&#xff0c;汽车制造企业正积极寻求提升智能化水平的途径。富唯智能的3D视觉引导机器人抓取技术为汽车制造企业提供了一种高效、智能的自动化解决方案。 项目目标 某汽车制造企业希望通过引入智能化技术提升生产线的自动化水平和智能化程度。他们希望…