>  기사  >  백엔드 개발  >  Go에서 Ogg 오디오 지속 시간 계산: 단계별 가이드

Go에서 Ogg 오디오 지속 시간 계산: 단계별 가이드

PHPz
PHPz원래의
2024-09-05 21:31:09452검색

Calculating Ogg Audio Duration in Go: A Step-by-Step Guide

Discord를 복제하려고 하다가 오디오에 ogg 형식을 사용한다는 것을 알게 되었고(제 생각에는) 데이터베이스에 저장할 오디오 길이를 가져오려고 합니다.

OGG 오디오 지속 시간을 가져오는 스택오버플로 솔루션이 매우 매력적이었습니다. 이 접근 방식에는 파일 끝을 찾고, 마지막 Ogg 페이지 헤더를 찾고, 해당 과립 위치를 읽는 작업이 포함됩니다.

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)
}

여기에서 공유하기로 결정했습니다. 구현이 매우 멋지다고 생각하고 다른 사람들에게 도움이 될 수도 있습니다

위 내용은 Go에서 Ogg 오디오 지속 시간 계산: 단계별 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.