9
votes

C #: Concaténate 2 fichiers mp3

J'ai essayé de concaténer 2 fichiers MP3 à l'aide du code ci-dessous. J'ai reçu un nouveau fichier que je peux jouer la première moitié du (premier fichier complet), mais la seconde moitié est silencieuse. La longueur du nouveau fichier était correcte. Qu'est-ce que je fais mal? XXX


3 commentaires

Les deux fichiers ont-ils le même bittrate?


Oui et: Dois-je couper l'en-tête du deuxième fichier ou quelque chose comme ça


Il y a un bogue dans votre code. Vous n'entendez que la deuxième chanson. Voir ma réponse ci-dessous


6 Réponses :


2
votes

Chaque fichier MP3 a une en-tête au début du fichier contenant les métadonnées de la chanson. Au moins, vous devrez supprimer cela sur le deuxième fichier.

Voici une question de dépassement de pile précédente, Comment puis-je Fusionner / rejoindre des fichiers MP3 avec C #? .

Voici un autre lien vers lire mp3 Informations sur la balise (ID3V1 et ID3V2) , cela pourrait vous aider à supprimer.


1 commentaires

Peut-être juste sauter ces nombreux octets aidera. Vous trouverez plus d'informations sur le format de fichier MP3 ici ici mp3-tech.org/programmer/frame_header. HTML



15
votes

Je suis prêt à parier que vous entendez seulement la deuxième chanson. (Et que soit que les deux fichiers sont la même longueur ou le premier est plus court)

Vous copiez les deuxième données de la chanson sur la première. Et les données MP3 sont en streaming afin que vous puissiez simplement ajouter les fichiers les uns aux autres sans vous soucier des débits (pendant qu'ils peuvent glitoir) le débit binaire doit régler automatiquement. P>

détail sur en-têtes de cadre MP3 p>

... Essayez ceci ... P>

using (var fs = File.OpenWrite(Path.Combine(path, "3.mp3")))
{
    var buffer = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    buffer = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}


4 commentaires

Cela fonctionnera en quelque sorte, mais vous obtiendrez probablement des balises ID3 assis au milieu du fichier de sortie. Il est préférable de les dépouiller (au moins pour les fichiers suivants)


Très vrai, mais à cause des en-têtes de cadre, cela ne devrait pas affecter l'audio.


Fumant? Ou avez-vous voulu dire streaming?


J'ai rencontré beaucoup de réponses et cela a travaillé. N'ont pas encore expliqué l'explication de décaper les en-têtes, mais cela ne semblait pas affecter l'audio lorsque je l'ai testé.



2
votes

Cette question a été posée avant ici et ici . Voir aussi Lecture des en-têtes mp3 en C # , mais au lieu de lire L'en-tête Vous voulez simplement le désactiver, concaténer le reste, puis générer un nouvel en-tête pour le fichier concaténé.

EDIT : Après avoir une lecture supplémentaire apparemment, cela ne fait aucune différence si vous concalez simplement les fichiers sans décaper les étiquettes ID3. Mais cela semble toujours comme une bonne idée de les éliminer en premier.


2 commentaires

Je ne trouve rien dans ces messages qui m'aide. Comment puis-je couper l'en-tête?


Découvrez où il se termine et commencez à copier là-bas



3
votes

Voici comment vous pouvez concaténer des fichiers MP3 en utilisant Naudio :

public static void Combine(string[] inputFiles, Stream output)
{
    foreach (string file in inputFiles)
    {
        Mp3FileReader reader = new Mp3FileReader(file);
        if ((output.Position == 0) && (reader.Id3v2Tag != null))
        {
            output.Write(reader.Id3v2Tag.RawData,
                         0,
                         reader.Id3v2Tag.RawData.Length);
        }
        Mp3Frame frame;
        while ((frame = reader.ReadNextFrame()) != null)
        {
            output.Write(frame.RawData, 0, frame.RawData.Length);
        }
    }
}


2 commentaires

Où est la marque de repos? Comment enregistrez-vous la sortie de flux en tant que nouveau fichier MP3? Dites-moi s'il vous plaît TY Comment appelez-vous cette fonction de combinaison où est le précédent?


Cette solution ne fonctionne pas sous Linux - vous obtiendrez: system.dllnotfoundException: impossible de charger la bibliothèque partagée 'msacm32.dll' ou l'une de ses dépendances. Plus d'infos: Github.com/Naudio/naudio/issues/472



5
votes

simple: xxx


1 commentaires

Pourquoi créeriez-vous une liste juste pour itérer sur l'ensemble? Utilisez simplement le mot clé foreach.



2
votes

Comme tout le sait, les fichiers MP3 ne sont que des images et vous pouvez concaténer les flux ensemble: xxx

et entend l'utilisation: < Pré> xxx


0 commentaires