Saya cuba mengklon perselisihan dan saya mendapati mereka menggunakan format ogg untuk audio (saya rasa), saya cuba mendapatkan tempoh audio untuk disimpan dalam pangkalan data.
Penyelesaian stackoverflow tentang mendapatkan tempoh audio OGG, saya rasa menarik. Pendekatan ini melibatkan pencarian ke penghujung fail, mencari pengepala halaman Ogg terakhir dan membaca kedudukan butirannya.
func getOggDurationMs(reader io.Reader) (int64, error) { // Read the entire Ogg file into a byte slice data, err := io.ReadAll(reader) if err != nil { return 0, fmt.Errorf("error reading Ogg file: %w", err) } // Search for the "OggS" signature and calculate the length var length int64 for i := len(data) - 14; i >= 0 && length == 0; i-- { if data[i] == 'O' && data[i+1] == 'g' && data[i+2] == 'g' && data[i+3] == 'S' { length = int64(readLittleEndianInt(data[i+6 : i+14])) } } // Search for the "vorbis" signature and calculate the rate var rate int64 for i := 0; i < len(data)-14 && rate == 0; i++ { if data[i] == 'v' && data[i+1] == 'o' && data[i+2] == 'r' && data[i+3] == 'b' && data[i+4] == 'i' && data[i+5] == 's' { rate = int64(readLittleEndianInt(data[i+11 : i+15])) } } if length == 0 || rate == 0 { return 0, fmt.Errorf("could not find necessary information in Ogg file") } durationMs := length * 1000 / rate return durationMs, nil } func readLittleEndianInt(data []byte) int64 { return int64(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16 | uint32(data[3])<<24) }
Saya memutuskan untuk berkongsi di sini, saya mendapati pelaksanaannya sangat bagus dan mungkin membantu beberapa orang lain
Atas ialah kandungan terperinci Mengira Tempoh Audio Ogg dalam Go: Panduan Langkah demi Langkah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!