前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FFmpeg都7.1了,还没有适配C++的文件文件夹操作

FFmpeg都7.1了,还没有适配C++的文件文件夹操作

作者头像
程序员的园
发布2024-11-14 16:31:51
140
发布2024-11-14 16:31:51
举报
文章被收录于专栏:程序员的园——原创文章

1. 引言

在音视频处理的开发过程中,文件和文件夹的操作是必不可少的。无论是从外部加载音视频数据,还是将处理后的结果保存到磁盘中,开发者都需要处理文件的读写、文件的遍历等操作。为便于进行文件和文件夹操作,FFmpeg提供了一些许方法,但是功能有限且易用性差,如果在C++程序中使用FFmpeg,建议使用C++原生方法。本文将在介绍FFmpeg中文件/文件夹操作的基础上,引入C++支持的文件/文件夹操作的方法。

2. FFmpeg的文件与文件夹操作

FFmpeg通过`avio`接口提供了一些基本的文件和文件夹操作功能。

2.1 文件操作

ffmpeg提供了avio相关的接口进行文件的读取和写入操作。以下是一些常用的接口:

  • avio_open接口:打开文件,avio_open接口支持多种模式打开文件
    • AVIO_FLAG_READ:以只读模式打开文件,如果文件不存在则打开失败,可用于文件存在性检测
    • AVIO_FLAG_WRITE:以只写模式打开文件,如果文件不存在则创建文件
    • AVIO_FLAG_READ_WRITE:以读写模式打开文件,如果文件不存在则创建文件
  • avio_read接口:从文件中读取数据
  • avio_write接口:将数据写入文件
  • avio_close接口:关闭文件

示例代码

代码语言:javascript
复制
#include <libavformat/avformat.h>
 
void open_and_write_file()
{
    AVIOContext* avio_ctx = nullptr;
    const char* data = "Hello, FFmpeg!";
 
    // 打开文件进行写入
    if (avio_open(&avio_ctx, "output.txt", AVIO_FLAG_WRITE) < 0)
    {
        fprintf(stderr, "Error opening file for writing\n");
    }
    else
    {
        avio_write(avio_ctx, (const uint8_t*)data, strlen(data));  // 写入数据
        avio_flush(avio_ctx);  // 确保数据写入磁盘
        avio_close(avio_ctx);  // 关闭文件
    }
}
 
//open and read file
void open_and_read_file()
{
    AVIOContext* avio_ctx = nullptr;
    uint8_t buffer[1024];
 
    if (avio_open(&avio_ctx, "input.txt", AVIO_FLAG_READ) < 0)
    {
        fprintf(stderr, "Error opening file for reading\n");
    }
    else
    {
        int bytes_read = avio_read(avio_ctx, buffer, sizeof(buffer));
        if (bytes_read >= 0)
        {
            printf("Read %d bytes\n", bytes_read);
        }
        avio_close(avio_ctx);  // 关闭文件
    }
}

2.2 文件夹操作

ffmpeg提供了avio_xxx_dir相关的接口进行文件夹的操作。以下是一些常用的接口:

  • avio_open_dir接口:打开文件夹
  • avio_read_dir接口:遍历文件夹中的文件和子文件夹
  • avio_close_dir接口:关闭文件夹

示例代码

代码语言:javascript
复制
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
 
void traverse_folder()
{
    AVIODirContext* dir_ctx = nullptr;
    AVIODirEntry* entry = nullptr;
 
    if (avio_open_dir(&dir_ctx, "test_folder", nullptr) == 0)
    {
        while (avio_read_dir(dir_ctx, &entry) >= 0 && entry != nullptr)
        {
            printf("Found file or directory: %s\n", entry->name);
            avio_free_directory_entry(&entry);  // 释放条目
        }
        avio_close_dir(&dir_ctx);  // 关闭文件夹
    }
    else
    {
        printf("Failed to open directory.\n");
    }
}

提示:

如上代码在windows平台使用FFmpeg的7.0.2版本编译通过,但是运行失败,返回错误码-40(函数未实现),在linux Ubantu 22.04上使用ffmpeg 4.4.1版本可以正常运行,由于我不建议使用FFmpeg进行文件/文件夹操作,也就未深究原因,特此提示。

3. C++17 的文件与文件夹操作

3.1 文件操作

C++中对于文件的操作方法较多,除了FILE外,fstream也是一个常用的文件操作类。其中:

  • fstream相关接口:
    • fstream:用于文件的读写操作,支持文本模式和二进制模式。
    • ifstream:用于文件的读取操作,支持文本模式和二进制模式。
    • ofstream:用于文件的写入操作,支持文本模式和二进制模式。
  • FILE相关接口
    • fopen:用于文件的打开操作,支持文本模式和二进制模式。
    • fclose:用于文件的关闭操作。
    • fread:用于文件的读取操作,支持二进制模式。
    • fwrite:用于文件的写入操作,支持二进制模式。
    • fseek:用于文件的定位操作。

FILE相关接口较常用,不再提供示例代码,仅书写fstream相关接口的示例代码如下:

代码语言:javascript
复制
void open_and_write_file()
{
    std::ofstream out_file("output.txt");
    if (out_file.is_open()) {
        out_file << "Hello, C++17 filesystem!";
        out_file.close();
    } else {
        std::cerr << "Error opening file for writing\n";
    }
}
 
void open_and_read_file()
{
    std::ifstream in_file("input.txt");
    if (in_file.is_open()) {
        std::string line;
        while (std::getline(in_file, line)) {
            std::cout << line << std::endl;
        }
        in_file.close();
    } else {
        std::cerr << "Error opening file for reading\n";
    }
}

3.2 文件夹操作

C++17的`filesystem`库提供了丰富的文件系统操作功能,包括文件和文件夹的创建、删除、遍历等。以下是一些常用的接口:

  • std::filesystem::create_directory():创建文件夹
  • std::filesystem::create_directories():创建多级文件夹
  • std::filesystem::exists():检查文件或文件夹是否存在
  • std::filesystem::remove():删除文件或文件夹
  • std::filesystem::copy():复制文件或文件夹
  • std::filesystem::rename():重命名文件或文件夹
  • std::filesystem::directory_iterator:遍历文件夹中的内容

也可参阅之前的文章[现代C++]文件系统操作 [现代C++]读写文件

4. 总结与建议

FFmpeg提供的文件/文件夹操作方法在易用性和灵活性上都不及C++提供的方法,如果在C++中进行文件/文件夹操作,建议使用C++原生方法,本文进一步回顾了C++提供的相关方法,希望能对大家有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
媒体处理
媒体处理(Media Processing Service,MPS)是智能、强大、全面的多媒体数据处理服务,行业支持最全面的音视频编码标准,基于自研编码内核和AI算法,提供音视频转码和增强、媒体智能、质检评测等能力,帮助您提升媒体质量、降低成本,满足各类场景的音视频处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档