【问题标题】:Concat mp3 files in one file and retrieve any specific mp3 file将 mp3 文件合并到一个文件中并检索任何特定的 mp3 文件
【发布时间】:2012-12-10 02:48:21
【问题描述】:

如何将多个(例如 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 文件。

【问题讨论】:

  • 这是更大问题的一部分吗?我不明白这会有什么用..但我可能是错的。

标签: c# file-io mp3


【解决方案1】:

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

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

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

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

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

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

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

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

8) 关闭它!

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢你们帮助我。我决定使用密码保护来压缩它们。所以,没有人可以提取我的文件:)
    【解决方案3】:

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

    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[]
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-12-09
        • 2019-10-03
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 2014-08-19
        • 1970-01-01
        相关资源
        最近更新 更多