9
votes

Comment obtenir la longueur d'un MP3 en C #

oui c'est un dupliqué exact de Cette question , mais le lien donné et accepté comme réponse ne fonctionne pas pour moi. Il renvoie des valeurs incorrectes (une mp3 de 2 minutes sera répertorie sous la liste 1'30, 3 minutes comme 2'20) sans motif évident.

Alors c'est à nouveau ici: comment puis-je obtenir la longueur d'un MP3 en utilisant c # ? p>

ou em> p>

Qu'est-ce que je fais mal avec le Classe MP3 MP3Header : P>

MP3Header mp3hdr = new MP3Header();
bool boolIsMP3 = mp3hdr.ReadMP3Information("1.mp3");
if(boolIsMP3)
  Response.Write(mp3hdr.intLength);


1 commentaires

Type de question dupliquée; J'ai essayé de répondre à cela ici: Stackoverflow.com/Questtions/383164/...


7 Réponses :


4
votes

Comment avez-vous vérifié les longueurs des mp3 qui sont "faux"? J'ai souvent constaté que les informations d'en-tête peuvent être fausses: il y avait une version particulière de boiteux qui avait ce problème, par exemple.

Si vous apportez les propriétés du fichier dans l'Explorateur Windows, qu'est-ce que ce spectacle?


4 commentaires

Un exemple: Audio MPEG COUCHE 3, Durée 1:29, BitTre: 128Kbps, Taux audio: 44kHz. La fonction trouve quelque chose comme 1:12 pendant la durée. Je n'aurai aucun contrôle sur le type de MP3 qui sera téléchargé sur le système, alors j'en ai besoin de ne pas y travailler de manière codée / débit / autre.


Après avoir testé avec Taglib, je pense que les MP3 que j'ai reçus sont un peu foirées ou codées différemment ... Je vais juste travailler sur ceci (voir mes autres commentaires sur les réponses de Jon et Thomas)


@MarCgg: Personnellement, je pense que vous devriez accepter la réponse de Thomas, comme étant plus généralement utile.


@MarCgg: Voulez-vous un échantillon de code qui utilise mpg123 et déterminera la durée du fichier MP3 exactement MP3?



12
votes

Apparemment, cette classe calcule la durée à l'aide de FileSize / BitTre. Cela ne peut fonctionner que pour un débit constant, et je suppose que votre MP3 a une variable bittrate ...

Edit: Jetez un coup d'œil à TagLib Sharp , il peut vous donner la durée


5 commentaires

Cela ressemble à un bittrate constant (voir mon commentaire sur la réponse de Jon). Comment pourrais-je tester cela?


À propos de votre édition: TagLib peut obtenir la durée? Ce serait génial, je vais vérifier cela en ce moment


Il ne renvoie que 0 ... Je suppose que les fichiers que j'ai reçus sont codés étrangement, ce qui expliquerait tout cela. Je pense que je vais juste trouver un moyen de contourner


TagLib Sharp me donne en résulter environ 70% de la durée réelle.


Presque tout le monde utilise un débit binaire variable ces jours-ci pour la musique



0
votes

0
votes

J'envisagerais d'utiliser une application externe pour le faire. Envisagez d'essayer SOX et il suffit d'exécuter la version du programme exécuté à l'aide de SOXI (pas d'EXE) et essayez d'analyser l'analyse. cette sortie. Compte tenu de vos options, je pense que vous feriez mieux de faire confiance à quelqu'un d'autre qui a passé le temps de travailler toute l'étrangeté des fichiers MP3 à moins que cette fonctionnalité ne soit noyau de ce que vous faites. Bonne chance!


3 commentaires

SOX sonne comme trop chers pour ce que j'essaie de faire, n'est-ce pas?


Ouais mais si cela fonctionne à chaque fois et que vous pouvez passer à la vie, ça vaut la peine?


vrai :) Je pense que je vais juste trouver un moyen de trouver. Tout cela est à envoyer à un lecteur Flash, mais je sais comment obtenir la durée dans le flash, je ne peux donc que le comprendre une fois que le fichier est envoyé. Merci pour la pensée Anwser!



3
votes

J'ai enveloppé une bibliothèque de décodeur MP3 et l'avons rendue disponible pour les développeurs .NET. Vous pouvez le trouver ici:

http://sourceforge.net/projects/mpg123net/

Inclus sont les échantillons pour convertir un fichier MP3 en PCM et lire des balises ID3.

Je suppose que vous pouvez l'utiliser pour lire la durée du fichier MP3. Le pire des cas sera que vous lisez tous les cadres et calculez la durée - VBR Fichier.

Pour déterminer avec précision la durée de mp3, vous devez lire tous les cadres et calculer la durée de leur durée de résumé. Il y a beaucoup de cas lorsque les gens mettent divers fichiers MP3 de «métadonnées», donc si vous estimez du débit et de la taille du fichier, vous devinerez mal.


0 commentaires

0
votes

La longueur du fichier VBR ne peut pas être estimée du tout. Chaque image mp3 à l'intérieur de celui-ci pourrait avoir un débit différent, donc de lire n'importe quelle partie du fichier, vous ne pouvez pas savoir quelle est la densité des données dans une autre partie du fichier. Le seul moyen de déterminer la longueur exacte de VBR MP3 est de le décoder en tout ou (si vous savez comment), lisez tous les en-têtes des cadres un par un et récupérez leur durée décodée.

Vous n'utiliserez que la méthode ultérieure uniquement si la CPU que vous utilisez est une ressource précieuse que vous devez enregistrer. Sinon, décodez l'ensemble du fichier et vous aurez la durée.

Vous pouvez utiliser mon port de MPG123 pour faire le travail: http://sourceforge.net/projects/mpg123net /

Plus: de nombreux fichiers MP3 ont une activité "Stuff", en tant que balises ID3, et si vous ne suivez pas tout le fichier, vous pouvez utiliser cette étiquette dans le calcul de la durée.


0 commentaires

0
votes

Il y a ma solution pour C # avec bibliothèque de traitement de son SOX .

public static double GetAudioDuration(string soxPath, string audioPath)
{
    double duration = 0;
    var startInfo = new ProcessStartInfo(soxPath,
        string.Format("\"{0}\" -n stat", audioPath));
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardOutput = true;
    var process = Process.Start(startInfo);
    process.WaitForExit();

    string str;
    using (var outputThread = process.StandardError)
        str = outputThread.ReadToEnd();

    if (string.IsNullOrEmpty(str))
        using (var outputThread = process.StandardOutput)
            str = outputThread.ReadToEnd();

    try
    {
        string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string lengthLine = lines.First(line => line.Contains("Length (seconds)"));
        duration = double.Parse(lengthLine.Split(':')[1]);
    }
    catch (Exception ex)
    {
    }

    return duration;
}


0 commentaires