1. 引言
在音视频处理的开发过程中,文件和文件夹的操作是必不可少的。无论是从外部加载音视频数据,还是将处理后的结果保存到磁盘中,开发者都需要处理文件的读写、文件的遍历等操作。为便于进行文件和文件夹操作,FFmpeg提供了一些许方法,但是功能有限且易用性差,如果在C++程序中使用FFmpeg,建议使用C++原生方法。本文将在介绍FFmpeg中文件/文件夹操作的基础上,引入C++支持的文件/文件夹操作的方法。
2. FFmpeg的文件与文件夹操作
FFmpeg通过`avio`接口提供了一些基本的文件和文件夹操作功能。
2.1 文件操作
ffmpeg提供了avio相关的接口进行文件的读取和写入操作。以下是一些常用的接口:
示例代码
#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相关的接口进行文件夹的操作。以下是一些常用的接口:
示例代码
#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也是一个常用的文件操作类。其中:
FILE相关接口较常用,不再提供示例代码,仅书写fstream相关接口的示例代码如下:
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`库提供了丰富的文件系统操作功能,包括文件和文件夹的创建、删除、遍历等。以下是一些常用的接口:
也可参阅之前的文章[现代C++]文件系统操作 [现代C++]读写文件
4. 总结与建议
FFmpeg提供的文件/文件夹操作方法在易用性和灵活性上都不及C++提供的方法,如果在C++中进行文件/文件夹操作,建议使用C++原生方法,本文进一步回顾了C++提供的相关方法,希望能对大家有所帮助。