Cách đơn giản nhất để xác định độ dài (tính bằng giây) của một tệp mp3 đã cho, mà không sử dụng thư viện bên ngoài? (nguồn python được đánh giá cao)Độ dài thời gian của một tệp mp3
Trả lời
Bạn có thể sử dụng pymad. Đó là một thư viện bên ngoài, nhưng không rơi vào bẫy Không phát minh ở đây. Bất kỳ lý do cụ thể bạn không muốn bất kỳ thư viện bên ngoài?
import mad
mf = mad.MadFile("foo.mp3")
track_length_in_milliseconds = mf.total_time()
Phát hiện here.
-
Nếu bạn thực sự không muốn sử dụng một thư viện bên ngoài, có một cái nhìn here và kiểm tra như thế nào anh ta thực hiện nó. Cảnh báo: nó phức tạp.
Tôi đồng ý với đề xuất thư viện bên ngoài. Tôi đã không sử dụng nó (hoặc Python cho rằng vấn đề). Nhưng một lần tôi đã cố gắng viết, trong C++ một chương trình có thể chơi MP3 đơn giản. Điều đó đã không xảy ra, nhưng tôi đã đi đủ xa để xác định thời lượng của tập tin. Tôi nghĩ về việc tái cấu trúc mã đó thành ... –
... đăng ở đây, nhưng nó khá phức tạp. (Và trong C++, không phải Python). Thậm chí không đơn giản từ xa. –
Chỉ cần một người đứng lên, có vẻ như tôi chỉ hoạt động trên một số nền tảng nhất định. Phiên bản mới nhất gặp sự cố khi cài đặt vì nó thiếu một trong các tệp thiết lập của riêng nó, mà nó khuyên tôi nên tạo bằng cách chạy tệp thứ hai có các lệnh linux trong đó. –
Bạn có thể đếm số lượng khung trong tệp. Mỗi khung có một mã bắt đầu, mặc dù tôi không thể thu hồi giá trị chính xác của mã bắt đầu và tôi không có thông số kỹ thuật MPEG nằm xung quanh. Mỗi khung có độ dài nhất định, khoảng 40ms cho lớp MPEG1 II.
Phương pháp này hoạt động đối với tệp CBR (Tốc độ bit không đổi), cách hoạt động của tệp VBR là một câu chuyện hoàn toàn khác.
Từ tài liệu dưới đây:
Đối với lớp tôi tập tin chúng tôi công thức này:
FrameLengthInBytes = (12 * bitrate/sampleRate + Padding) * 4
Đối với Layer II & III file sử dụng này công thức:
FrameLengthInBytes = 144 * BitRate/SampleRate + Padding
Tôi tin rằng chiều dài là 26ms. –
Nghe có vẻ quen thuộc. –
đơn giản, phân tích MP3 blob nhị phân để tính toán cái gì đó, bằng Python
Đó là âm thanh như một trật tự khá cao. Tôi không biết Python, nhưng đây là một số mã tôi đã tái cấu trúc từ một chương trình khác mà tôi đã từng viết.
Lưu ý: Đó là trong C++ (xin lỗi, đó là những gì tôi có). Ngoài ra, như là, nó sẽ chỉ xử lý tốc độ bit không đổi MPEG 1 Audio Layer 3 tập tin. Điều đó nên bao gồm hầu hết, nhưng tôi không thể thực hiện bất kỳ đảm bảo nào về việc này trong tất cả các trường hợp. Hy vọng rằng điều này làm những gì bạn muốn, và hy vọng tái cấu trúc nó vào Python là dễ dàng hơn làm nó từ đầu.
// determines the duration, in seconds, of an MP3;
// assumes MPEG 1 (not 2 or 2.5) Audio Layer 3 (not 1 or 2)
// constant bit rate (not variable)
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
//Bitrates, assuming MPEG 1 Audio Layer 3
const int bitrates[16] = {
0, 32000, 40000, 48000, 56000, 64000, 80000, 96000,
112000, 128000, 160000, 192000, 224000, 256000, 320000, 0
};
//Intel processors are little-endian;
//search Google or see: http://en.wikipedia.org/wiki/Endian
int reverse(int i)
{
int toReturn = 0;
toReturn |= ((i & 0x000000FF) << 24);
toReturn |= ((i & 0x0000FF00) << 8);
toReturn |= ((i & 0x00FF0000) >> 8);
toReturn |= ((i & 0xFF000000) >> 24);
return toReturn;
}
//In short, data in ID3v2 tags are stored as
//"syncsafe integers". This is so the tag info
//isn't mistaken for audio data, and attempted to
//be "played". For more info, have fun Googling it.
int syncsafe(int i)
{
int toReturn = 0;
toReturn |= ((i & 0x7F000000) >> 24);
toReturn |= ((i & 0x007F0000) >> 9);
toReturn |= ((i & 0x00007F00) << 6);
toReturn |= ((i & 0x0000007F) << 21);
return toReturn;
}
//How much room does ID3 version 1 tag info
//take up at the end of this file (if any)?
int id3v1size(ifstream& infile)
{
streampos savePos = infile.tellg();
//get to 128 bytes from file end
infile.seekg(0, ios::end);
streampos length = infile.tellg() - (streampos)128;
infile.seekg(length);
int size;
char buffer[3] = {0};
infile.read(buffer, 3);
if(buffer[0] == 'T' && buffer[1] == 'A' && buffer[2] == 'G')
size = 128; //found tag data
else
size = 0; //nothing there
infile.seekg(savePos);
return size;
}
//how much room does ID3 version 2 tag info
//take up at the beginning of this file (if any)
int id3v2size(ifstream& infile)
{
streampos savePos = infile.tellg();
infile.seekg(0, ios::beg);
char buffer[6] = {0};
infile.read(buffer, 6);
if(buffer[0] != 'I' || buffer[1] != 'D' || buffer[2] != '3')
{
//no tag data
infile.seekg(savePos);
return 0;
}
int size = 0;
infile.read(reinterpret_cast<char*>(&size), sizeof(size));
size = syncsafe(size);
infile.seekg(savePos);
//"size" doesn't include the 10 byte ID3v2 header
return size + 10;
}
int main(int argCount, char* argValues[])
{
//you'll have to change this
ifstream infile("C:/Music/Bush - Comedown.mp3", ios::binary);
if(!infile.is_open())
{
infile.close();
cout << "Error opening file" << endl;
system("PAUSE");
return 0;
}
//determine beginning and end of primary frame data (not ID3 tags)
infile.seekg(0, ios::end);
streampos dataEnd = infile.tellg();
infile.seekg(0, ios::beg);
streampos dataBegin = 0;
dataEnd -= id3v1size(infile);
dataBegin += id3v2size(infile);
infile.seekg(dataBegin,ios::beg);
//determine bitrate based on header for first frame of audio data
int headerBytes = 0;
infile.read(reinterpret_cast<char*>(&headerBytes),sizeof(headerBytes));
headerBytes = reverse(headerBytes);
int bitrate = bitrates[(int)((headerBytes >> 12) & 0xF)];
//calculate duration, in seconds
int duration = (dataEnd - dataBegin)/(bitrate/8);
infile.close();
//print duration in minutes : seconds
cout << duration/60 << ":" << duration%60 << endl;
system("PAUSE");
return 0;
}
Tôi không nghĩ rằng điều này sẽ làm việc cho các tập tin VBR. –
Điều này hoạt động hoàn hảo cho thứ tôi đang xây dựng ngay bây giờ, vì tôi không cần hỗ trợ VBR. Tất cả những gì tôi cần thay đổi là bitrate vì nó giả định 56k khi các tệp là 32k (đầu ra từ LAME). – alxp
Tôi biết, tôi đã nói nó chỉ tốt cho các tệp tốc độ bit không đổi. –
Vì google tín đồ, đây là một vài libs bên ngoài hơn:
mpg321 -t
ffmpeg -i
midentify (mplayer cơ bản) thấy Using mplayer to determine length of audio/video file
mencoder (vượt qua nó params không hợp lệ, nó sẽ nhổ ra một thông báo lỗi nhưng cũng cung cấp cho bạn thông tin về các tập tin trong câu hỏi, ex $ mencoder inputfile.mp3 -o giả)
MediaInfo chương trình http://mediainfo.sourceforge.net/en
ExifTool
linux "tập tin" lệnh
mp3info
sox
refs: https://superuser.com/questions/36871/linux-command-line-utility-to-determine-mp3-bitrate
http://www.ruby-forum.com/topic/139468
(làm này một wiki cho người khác để thêm vào).
và libs: .net: naudio, java: jlayer, c: libmad
Chúc mừng!
trong số các ffmpeg này và mpg321 cũng xử lý các liên kết http dưới dạng các vị trí tệp, tiếc là tệp sau tự động phát tệp, nhưng im hoàn toàn hài lòng với ffmpeg :) – Kami
Ngoài ra hãy xem tại audioread (một số distro Linux bao gồm ubuntu có các gói), https://github.com/sampsyo/audioread
audio = audioread.audio_open('/path/to/mp3')
print audio.channels, audio.samplerate, audio.duration
chỉ cần sử dụng mutagen
$pip install mutagen
sử dụng nó trong vỏ python:
from mutagen.mp3 import MP3
audio = MP3(file_path)
print audio.info.length
Câu trả lời hay nhất. Nó dễ dàng được cài đặt với PIP, không có yêu cầu nào khác và nó chỉ cung cấp thông tin được lưu trữ trong siêu dữ liệu của tệp – Zvika
- 1. Cách lấy độ dài của MP3 trong C#
- 2. Android - Cách đếm thời gian trong một thời gian dài
- 3. Độ dài thời gian chờ AJAX (XmlHttpRequest) theo trình duyệt
- 4. Độ phức tạp thời gian của random.sample
- 5. Cách trích xuất mã thời gian bắt đầu và siêu dữ liệu thời lượng/độ dài từ tệp .mov?
- 6. Tại sao chụp nhanh Windows mất một thời gian dài?
- 7. Có được chiều dài của một chuỗi một hoạt động liên tục thời gian không?
- 8. Cách kéo dài thời gian chờ của truy vấn SQL
- 9. Thêm vào hashmap mất một thời gian dài
- 10. Nhận thời lượng mp3 trong android
- 11. Tại sao IIS7 mất một thời gian dài
- 12. ALTER TABLE ADD COLUMN mất một thời gian dài
- 13. Thời gian thu gom rác cực dài
- 14. Cloning trên ubuntu mất một thời gian dài
- 15. Kết quả phân loại MySQL mất một thời gian dài
- 16. Java lưu trữ hai int trong một thời gian dài
- 17. Đếm độ dài (số dòng) của tệp CSV?
- 18. Chuyển đổi từ thời gian dài Postgres
- 19. Ứng dụng Rails hành khách của tôi đôi khi cần một thời gian dài để tải
- 20. Cách lấy thời lượng thực tế của một tệp tin MP3 (VBR hoặc CBR) phía máy chủ
- 21. Độ dài tối đa của một openID
- 22. Độ dài của một chuỗi theo pixel
- 23. Cách lấy thời lượng của MP3 trong .NET?
- 24. Chọn giữa Hudson và CruiseControl trong thời gian dài
- 25. boost :: asio :: io_service chiếm hàng đợi độ dài cho bộ đếm thời gian và bài viết
- 26. Xác định # độ dài chuỗi được xác định tại thời gian biên dịch
- 27. Thời gian tồn tại của thời gian
- 28. Độ phức tạp của thời gian nguyên trong Haskell
- 29. Độ phức tạp thời gian của thuật toán Prim
- 30. Độ phức tạp về thời gian của system.out.println
mở thư mục chứa trong Explorer sẽ hiển thị cột thời gian phát, màn hình sho t, ORC, tìm kiếm văn bản .... Gửi đến WTF/trò đùa hàng ngày – BCS