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

news2024/11/26 12:31:01

文章目录

    • 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.coloradmin.cn/o/1849079.html

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

相关文章

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

海外云手机自动化管理,高效省力解决方案

不论是企业还是个人&#xff0c;对于海外社媒的营销都是需要自动化管理的&#xff0c;因为自动化管理不仅省时省力&#xff0c;而且还节约成本&#xff1b; 海外云手机的自动化管理意味着什么&#xff1f;那就是企业无需再投入大量的人力和时间去逐一操作和监控每一台设备。 通…

鞋子分类数据集17399张69类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;17399 分类类别数&#xff1a;69 类别名称:[“0”,“1”,“2”,“3”,“4”…

全国实体商铺店铺商家采集工具,一键采集商家手机号,让你轻松找到目标客户

随着互联网的发展&#xff0c;越来越多的商家开始在网上开展业务&#xff0c;实体商铺的竞争也日益激烈。为了更好地吸引客户&#xff0c;很多商家都选择了线上推广和营销。然而&#xff0c;仅仅依靠线上推广是远远不够的&#xff0c;线下的实体商铺也需要积极拓展客源。因此&a…

DBeaver 数据结果集设置不显示逗号(太丑了)

从Navicat切换过来使用DBeaver&#xff0c;发现类似bigint 这种数据类型在结果集窗口中显示总是给我加上一个逗号&#xff0c;看着很不习惯&#xff0c;也比较占空间&#xff0c;个人觉得这种可读性也不好。 于是我在网上尝试搜索设置方法&#xff0c;可能我的关键词没命中&…

数据更新-插入元组(VALUES)、修改属性(SET)、删除元组(DELETE)

一、插入元组 1、插入单个元组&#xff08;使用的是VALUES子句&#xff09; &#xff08;1&#xff09;语句格式 INSERT INTO <表名> 【&#xff08;<属性名1【&#xff0c;<属性名2>&#xff0c;...】&#xff09;】 VALUES &#xff08;<常量1>【&a…

CATO原理中的数学与魔术(十四)——流程设计思路与升华

早点关注我&#xff0c;精彩不错过&#xff01; 系列终于进入尾声&#xff01;前面13篇文章已经穷尽搜刮掉我目力所及的全部CATO魔术的相关内容&#xff0c;并重新建立理论&#xff0c;分门别类进行了介绍。详情请戳&#xff1a; CATO原理中的数学与魔术&#xff08;十三&#…

aardio - 日历

写了个日历小例程&#xff0c;因 lunar 农历库存在问题&#xff0c;经过研究算是变相解决了&#xff0c;日历也完成了雏形&#xff0c;先开源出来&#xff0c;感兴趣的玩玩。 请下载最新paint库、customPlus库、lunar库。 不同的颜色搭配&#xff0c;实现不同的风格&#xff1…

小区业主管理系统

摘 要 随着城市化进程的加速和人口的不断增加&#xff0c;小区的数量也在不断增加。小区作为城市居民居住的主要场所&#xff0c;其管理工作也变得越来越重要。传统的小区业主管理方式存在诸多问题&#xff0c;如信息传递不畅、业务处理效率低下等。因此&#xff0c;开发一个高…

循环赛日程表

描述 n 2 ^ k个选手 每个选手必须与其他n-1个选手各赛一次每个选手一天赛一次比赛打n-1天 思路 k 3时的解 我们先进行假设&#xff1a;每个选手第一天和自己比&#xff0c;然后分解成4个子问题&#xff1a; (1)14号的第14天&#xff0c;对手1~4号; (2)14号的第58天&a…

数据结构——优先级队列(堆)Priority Queue详解

1. 优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该场景下&#xff0c;使用队列不合适 在这种情况下&#xff0c;数据结构应…

python-爬虫篇-爬取百度贴吧,段友之家的图片和视频

#!/usr/bin/env python # -*- coding: utf-8 -*-""" 爬取百度贴吧&#xff0c;段友之家的图片和视频 author: cuizy time&#xff1a;2018-05-19 """import requests import bs4 import osdef write_file(file_url, file_type):""&quo…

高可用设备日志采集工具

免费试用下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

Java——包

一、包 1、简要介绍 在Java编程语言中&#xff0c;包&#xff08;Package&#xff09; 是一种用来组织和管理类&#xff08;Class&#xff09;和接口&#xff08;Interface&#xff09;的机制。包为开发者提供了一种逻辑分组的方式&#xff0c;使代码更加模块化、结构化和易于…

获取泛型,泛型擦除,TypeReference 原理分析

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型&#xff0c;泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件&#xff0c;需要拿到数据的类型&#xff0c;使用反射感知数据类型的字段&#xff0c;来填充表字段名。可以看到泛型…

开关阀(3):Fisher DVC6200定位器原理及调试

Fisher DVC6200---Digital Valve Controllers&#xff08; 数字阀门控制器&#xff09;简写 DVC,而6200是Fisher DVC定位器发展的一个系列型号&#xff0c;是Fisher结合DVC2000、DVC6000系列&#xff0c;取其特点发展的有着高适用性和高可靠性的阀门定位器。 DVC6200 原理&…

企业智慧办公管理平台

摘要 在之前的疫情中&#xff0c;大多数企业都受到了较大的冲击&#xff0c;然而一些公司却因为工作的特殊性可以居家远程办公&#xff0c;不过这些企业在管理员工的过程中却遇到了较大的困难&#xff0c;这是因为这些企业的管理系统根本大多都无法管理员工的工作项目&#xf…

【启明智显分享】国产工业级HMI芯片Model3C——个位数价,双CAN配置

在工业自动化、汽车控制系统中&#xff0c;通信技术的选择至关重要。其中&#xff0c;CAN&#xff08;Controller Area Network&#xff09;通信协议以其高实时性、可靠性和灵活性&#xff0c;已成为这些领域的首选。 从单CAN到双CAN&#xff1a;双重保障效率翻倍 CAN是一种多…

GNN Algorithms(8): DDPM

扩散模型 diffusion model&#xff1a;正向扩散过程 Forward Diffusion Process、反向生成过程 Reverse Generation Process. 本质&#xff1a;DDPM, Denoising Diffusion Probabilistic Model T steps 加噪&#xff1a;没有参数&#xff0c; ->随机取一个每一步都要加的随…

基于SSM+Jsp的体育竞赛成绩管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…