Array.Clear(buffer, 0, buffer.Length);
total += s.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, buffer.Length);
Вам не нужно очищать весь массив перед чтением - это бессмысленно. Но вы должны проверить, сколько байтов вы на самом деле прочитали , нет никакой гарантии, что весь массив будет заполнен каждый раз (и, вероятно, не будет):
int bytesRead = s.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, bytesRead);
total+=bytesRead;
Кроме того, воспроизводится ли файл (даже если он больше не поврежден после исправления кода записи файла), зависит от формата, который вы загружаете - какой это кодек / тип файла?