0

如何将许多(例如 500 个)mp3 文件合并为一个文件(任何类型),然后将任何特定文件提取为 mp3 格式?

目前我使用以下代码获取所有文件:

int i = 0;
string[] files = new string[500];
foreach (var path in Directory.GetFiles(@"R:\abc\a\"))
{
    files[i++] = path;
}

提前致谢。

更新:如果我无法提取任何特定的 mp3 文件,那么我想将所有 mp3 文件提取到指定目录。ZIP、RAR 等是不够的,因为我必须防止人类在没有我的程序的情况下提取 mp3 文件。

4

4 回答 4

2

无需实际为您编写代码,您可以执行以下操作:

1) 以二进制模式创建文件。

2) 将一个空的 Int32 值写入流。

3)将mp3文件的数量写入流。

4) 创建一个数组,大小为多少个mp3文件。我们将在此处存储它们的偏移量。

5) 对于每个文件,以二进制模式读取。将当前文件位置存储在上述数组中,并将 mp3 文件写入我们的输出文件。

6)再次记下输出文件的位置,并写出包含所有mp3文件位置的数组。

7) 寻找到文件的开头,用文件位置的偏移量覆盖我们最初写入的值。

8) 关闭它!

现在,当我们想要获取特定的 MP3 时,我们可以打开这个文件,读取前两个 Int32,它会告诉我们索引的偏移量,以及有多少。然后,您可以寻找到适当的位置并提取 mp3 文件。

于 2012-12-09T09:16:27.780 回答
1

虽然自制的容器格式(例如此处其他答案中建议的格式)可能有效,但我建议使用众所周知的容器格式,例如 .zip。尽管您不会从压缩中获得太多好处,但您将获得文件名,以及其他 progs 创建/提取文件存档的能力。

如果您需要有关如何以编程方式创建 .zip 的帮助,请研究网络(尤其是 StackOverflow),如果您仍然不知道,请作为单独的问题提出。

于 2012-12-09T09:46:34.150 回答
1

如果将所有字节连接在一起,请记住每个文件名以及它是多少字节,您可以使用该信息为每个音乐文件找到正确的字节段。尚未对此进行测试,但应该给您一个想法。

IEnumerable<FileInfo> Mp3Files = new DirectoryInfo(dir).GetFiles();

// catalog all names and their length in bytes (you can save this somewhere)
IEnumerable<Mp3File> musicFiles = Mp3Files.Select(o => new Mp3File() { Name = o.Name, Size = o.Length });

// concat all into one
byte[] musicData = files.SelecMany(o => File.ReadAllBytes(o.FullName)).ToArray();
File.WriteAllBytes("allmusic.data", musicData);

byte[] GetSingleMusicFile(string name)
{
    // find the music file by name, and get how many bytes it is
    int bytesToTake = musicFiles.First(o => o.Name == name).Length;

    // count all the music files BEFORE it and add up their bytes to find out how many bytes to skip
    int bytesToSkip = musicFiles.TakeWhile(o => o.Name != name).Sum(o => o.Size);

    // skip the bytes until you get to your music file then take its bytes
    byte[] singleMusicData = musicData.Skip(bytesToSkip).Take(bytesToTake).ToArray();
    return singleMusicData[]
}
于 2012-12-09T09:33:10.427 回答
0

谢谢你们有能力帮助我。我决定使用密码保护来压缩它们。所以,没有人可以提取我的文件:)

于 2012-12-09T10:24:54.563 回答