如何在c++中将数百个二进制文件组合为一个输出文件



我有一个文件夹,里面装满了数百个.aac文件,我正在尝试"包装";以我所能做到的最有效的方式将它们合并到一个文件中。

我尝试过以下操作,但最终只得到了一个只有几个字节长的文件,或者音频听起来有点颤抖和失真。

// Now we want to get all of the files in the folder and then repack them into an aac file as fast as possible
void Repacker(string FileName)
{
string data;
boost::filesystem::path p = "./tmp/";
boost::filesystem::ofstream aacwriter;
aacwriter.open("./" + FileName + ".aac", ios::app);
boost::filesystem::ifstream aacReader;
boost::filesystem::directory_iterator it{ p };
cout << "Repacking File!" << endl;
while (it != boost::filesystem::directory_iterator{}) {
aacReader.open(*it, std::ios::in | ios::binary);
cout << "Writing " << *it << endl;
aacReader >> data;
++it;
aacwriter << data;
aacReader.close();
}
aacwriter.close();
}

我已经看了以下问题,试图帮助解决这个问题

将两个文件合并在一起

将多个txt文件合并到一个中

如何在C++中将整个文件读取为std::字符串?

将整个ASCII文件读取到C++std::string 中

将两个文件合并为一个

然而,不幸的是,这些都没有回答我的问题。

它们要么都与文本文件有关,要么都与不同时处理数百个文件的函数有关。

我正在尝试写入二进制数据,而不是文本。音频要么全是颤音,要么文件只有几个字节长。

如果有一种记忆有效的方法可以做到这一点,请告诉我。我正在使用C++20和boost。非常感谢。

这些文件有一个内部结构:头、块/帧等,而在连接的文件中简单地存在多个头会打乱预期的结果。

看看AAC文件的格式结构,你会发现它并不是那么简单。

您最好的尝试应该是使用FFMPEG,因为它具有连接媒体文件的功能,而不会强制重新编码数据。这有点复杂,因为FFMPEG的命令行非常复杂,并不总是非常直观,但只要所有AAC文件都使用相同的编码和特性,它就可以工作。否则,您需要对它们进行重新编码,但这也可以自动完成。查看此网络研究以获取一些基本信息。

否则,您可能会使用FFMPEG使用的基本库,例如libavcodec(可在FFMPEG.org上获得(、Fraunhofer FDK AAC等。但您还有很多工作要做,最后,您将完全完成FFMPEG已经完成的工作,因为它依赖于这些库。其他AAC库不会更容易使用。

显然,你也可以"嵌入";FFMPEG在您的应用程序中,调用ffprobe等工具来分析文件,并将ffmpeg作为子进程自动调用为可执行文件。

注意:如果您计划分发程序,请注意许可。FFMPEG授权真的不简单,大多数时候它都是作为源分发的,以避免恶性案件。

最新更新