2009-07-31 41 views
8

Có đây là bản sao chính xác của this question, nhưng liên kết đã cho và được chấp nhận là câu trả lời không hoạt động đối với tôi. Nó trở về giá trị không chính xác (một mp3 2 phút sẽ được liệt kê là 1'30, 3 phút là 2'20) không có mô hình rõ ràng.Cách lấy độ dài của MP3 trong C#

Vì vậy, đây là một lần nữa: làm thế nào tôi có thể nhận được độ dài của một MP3 bằng cách sử dụng C#?

hoặc

Tôi đang làm gì sai với MP3Header class:

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

Loại câu hỏi trùng lặp; Tôi đã cố gắng trả lời ở đây: http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 –

Trả lời

10

Dường như lớp này tính toán thời lượng bằng cách sử dụng tệpSize/bitRate. Điều này chỉ có thể làm việc cho bitrate không đổi, và tôi giả MP3 của bạn có bitrate biến ...

EDIT: có một cái nhìn tại TagLib Sharp, nó có thể cung cấp cho bạn thời gian

+0

Dường như bitrate không đổi (xem bình luận của tôi về câu trả lời của Jon). Làm thế nào tôi có thể kiểm tra điều này? – marcgg

+0

về chỉnh sửa của bạn: taglib có thể nhận được thời lượng? Thật tuyệt vời, tôi sẽ kiểm tra điều này ngay bây giờ – marcgg

+0

Nó chỉ trả về 0 ... Tôi đoán rằng các tập tin tôi đã được đưa ra được mã hóa kỳ lạ, mà sẽ giải thích tất cả điều này. Tôi nghĩ rằng tôi sẽ chỉ tìm thấy một cách xung quanh nó – marcgg

4

Làm thế nào bạn đã xác định chắc chắn độ dài của MP3 là "sai"? Tôi thường thấy rằng thông tin tiêu đề có thể sai: có một phiên bản LAME cụ thể có vấn đề này, chẳng hạn.

Nếu bạn đưa các thuộc tính của tệp lên trong Windows Explorer, điều gì sẽ hiển thị?

+0

Một ví dụ: Âm thanh MPEG Lớp 3, Thời lượng 1: 29, Tốc độ bit: 128kbps, Tốc độ âm thanh: 44kHz. Hàm tìm thấy một cái gì đó giống như 1:12 cho thời gian. Tôi sẽ không có quyền kiểm soát loại MP3 sẽ được tải lên hệ thống, vì vậy tôi cần nó để làm việc không có vấn đề mã hóa/bitrate/bất cứ điều gì. – marcgg

+0

Sau khi thử nghiệm với taglib tôi nghĩ rằng các mp3 tôi đã được đưa ra là một chút sai lầm hoặc mã hóa khác nhau ... Tôi sẽ chỉ làm việc theo cách của tôi xung quanh này (xem bình luận khác của tôi về câu trả lời của Jon và Thomas) – marcgg

+4

@marcgg: Cá nhân tôi nghĩ bạn nên chấp nhận câu trả lời của Thomas, vì nó thường hữu ích hơn. –

0

Tôi sẽ xem xét sử dụng ứng dụng bên ngoài để thực hiện việc này. Cân nhắc thử Sox và chỉ chạy phiên bản của chương trình được thực hiện bằng cách sử dụng soxi (không có exe) và thử phân tích cú pháp kết quả đó. Với các lựa chọn của bạn, tôi nghĩ bạn nên tin tưởng một người khác đã dành thời gian để tìm ra tất cả sự kỳ quặc trong các tệp mp3 trừ khi chức năng này là cốt lõi cho những gì bạn đang làm. Chúc may mắn!

+0

sox âm thanh như overkill cho những gì tôi đang cố gắng để làm, bạn không nghĩ? – marcgg

+0

Vâng, nhưng nếu nó hoạt động mọi lúc và bạn có thể tiếp tục cuộc sống thì điều đó có đáng không? – Jon

+0

true :) Tôi nghĩ rằng tôi sẽ chỉ tìm thấy một cách xung quanh. Tất cả điều này là để gửi đến một cầu thủ flash, nhưng tôi biết làm thế nào để có được thời gian trong flash, vì vậy tôi chỉ có thể con số nó ra một khi các tập tin được gửi đi. Cảm ơn bạn đã suy nghĩ anwser! – marcgg

3

Tôi đã bao gồm thư viện bộ giải mã mp3 và cung cấp cho các nhà phát triển .net. Bạn có thể tìm thấy nó ở đây:

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

Bao gồm các mẫu để chuyển đổi tập tin mp3 để PCM, và đọc các thẻ ID3.

Tôi đoán bạn có thể sử dụng nó để đọc thời lượng tệp mp3. Trường hợp xấu nhất sẽ là bạn đọc tất cả các khung và tính thời lượng - tệp VBR.

Để xác định chính xác thời lượng mp3, bạn CÓ ĐỂ đọc tất cả các khung và tính thời lượng từ tổng thời lượng của chúng. Có rất nhiều trường hợp khi mọi người đặt 'siêu dữ liệu' khác nhau bên trong các tệp mp3, vì vậy nếu bạn ước tính từ kích thước bitrate và tệp, bạn sẽ đoán sai.

0

Độ dài của tệp VBR KHÔNG thể ước tính được. Mỗi khung mp3 bên trong nó có thể có tốc độ bit khác nhau, do đó, từ việc đọc bất kỳ phần nào của tệp, bạn không thể biết mật độ dữ liệu nằm ở bất kỳ phần nào khác của tệp. Cách duy nhất để xác định chiều dài EXACT của VBR mp3 là DECODE toàn bộ, HOẶC (nếu bạn biết cách) đọc tất cả các tiêu đề của từng khung một và thu thập DURATION đã giải mã của chúng.

Bạn sẽ chỉ sử dụng phương thức sau nếu CPU bạn sử dụng là tài nguyên quý giá mà bạn cần lưu. Nếu không, hãy giải mã toàn bộ tệp và bạn sẽ có thời lượng.

Bạn có thể sử dụng cổng của tôi về mpg123 xmms để thực hiện công việc: http://sourceforge.net/projects/mpg123net/

thêm: nhiều file mp3 có "công cụ" được thêm vào nó, như một thẻ id3, và nếu bạn không đi qua tất cả các tập tin bạn có thể nhầm lẫn sử dụng thẻ đó trong tính toán thời lượng.

0

Có giải pháp của tôi cho C# với sox thư viện xử lý âm thanh.

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; 
} 
Các vấn đề liên quan