簡體   English   中英

在一個文件中連接mp3文件並檢索任何特定的mp3文件

[英]Concat mp3 files in one file and retrieve any specific mp3 file

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

無需實際為您編寫代碼,您可以執行以下操作:

1)以二進制模式創建文件。

2)將空的Int32值寫入流。

3)將mp3文件的數量寫入流中。

4)創建一個數組,其大小為mp3文件數。 我們將在此處存儲其偏移量。

5)對於每個文件,以二進制模式讀取。 將當前文件位置存儲在上述數組中,然后將mp3文件寫到我們的輸出文件中。

6)再次記下輸出文件的位置,並寫出包含所有mp3文件位置的數組。

7)查找文件的開頭並覆蓋我們最初寫入的值,並加上文件位置的偏移量。

8)關閉!

現在,當我們要獲取特定的MP3時,可以打開此文件,讀取前兩個Int32,它們將告訴我們索引的偏移量以及索引的偏移量。 然后,您可以搜索到合適的位置並提取mp3文件。

如果將所有字節合並在一起,則請記住每個文件名以及文件名的多少個字節,您可以使用該信息為每個音樂文件找到正確的字節段。 還沒有測試過,但是應該給你一個想法。

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

雖然可以使用自制的容器格式(例如此處其他答案中建議的格式),但我建議使用眾所周知的容器格式,例如.zip。 盡管您不會從壓縮中獲得很多好處,但是您將獲得文件名以及其他編程序創建/提取文件存檔的功能。

如果您需要有關如何以編程方式創建.zip的幫助,請研究網絡(尤其是StackOverflow),如果仍然不知道,請作為一個單獨的問題提出。

謝謝你們有能力幫助我。 我決定使用密碼保護來壓縮它們。 因此,沒有人可以提取我的文件:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM