使用Golang獲取音視頻時長信息的示例代碼
一、工具簡介
這些工具都是與多媒體處理和流媒體相關(guān)的開源工具,它們都屬于 FFmpeg 多媒體框架。
- FFmpeg
是一個用于處理多媒體內(nèi)容(音頻、視頻、圖像等)的命令行工具。它可以執(zhí)行各種各樣的操作,包括轉(zhuǎn)碼、剪輯、合并、分離、編碼、解碼等。FFmpeg 是一個功能強大且廣泛使用的工具,可以在多種平臺上運行。
- FFplay
是 FFmpeg 提供的一個簡單的媒體播放器,它可以播放各種格式的音頻和視頻文件。FFplay 是基于 FFmpeg 庫構(gòu)建的,它提供了一個輕量級的命令行界面,可用于快速播放多媒體文件,適用于測試和簡單的播放任務(wù)。
- FFprobe
是一個用于分析多媒體文件的工具。它提供了詳細的信息,包括多媒體文件的編解碼器、格式、流信息等。FFprobe 可以幫助用戶了解多媒體文件的特性,例如分辨率、幀率、比特率等,這對于診斷和處理多媒體文件非常有用。
- FFserver
是一個流媒體服務(wù)器,可以用于實時轉(zhuǎn)碼和分發(fā)音頻/視頻流。它可以接受來自各種來源(如攝像頭、音頻接口等)的多媒體流,并將其轉(zhuǎn)碼為不同的格式和分辨率,然后通過網(wǎng)絡(luò)分發(fā)給客戶端。FFserver 可以用于構(gòu)建自己的流媒體平臺,例如音視頻直播服務(wù)或視頻點播服務(wù)。
二、使用golang獲取時間長
package main
import (
"bufio"
"fmt"
"os/exec"
"strconv"
)
// getDuration 通過調(diào)用 ffprobe 來獲取音視頻文件的時長
// 函數(shù)接收一個字符串參數(shù) filePath,表示音視頻文件的路徑。
// 函數(shù)返回兩個值:一個整數(shù)表示時長(秒),一個 error 表示可能發(fā)生的錯誤。
func getDuration(filePath string) (int, error) {
// 使用 exec.Command 創(chuàng)建一個新的命令,調(diào)用 ffprobe 并帶上一系列參數(shù)來指示它只輸出文件的時長。
cmd := exec.Command("/Users/lijie/workspace/ffmpeg-lijie/ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filePath)
//通過 StdoutPipe 方法獲取命令的標(biāo)準輸出流,以便我們可以讀取 ffprobe 的輸出。
stdout, err := cmd.StdoutPipe()
//如果在獲取輸出流時發(fā)生錯誤,則返回錯誤。
if err != nil {
return 0, err
}
//啟動 ffprobe 命令。如果啟動失敗,則返回錯誤。
if err := cmd.Start(); err != nil {
return 0, err
}
//創(chuàng)建一個新的 bufio.Scanner 來讀取 ffprobe 的標(biāo)準輸出。
scanner := bufio.NewScanner(stdout)
//使用 Scan 方法讀取輸出的第一行(即文件的時長)。
if scanner.Scan() {
//scanner.Text() 獲取讀取到的字符串。
durationStr := scanner.Text()
//使用 strconv.ParseFloat 將時長字符串轉(zhuǎn)換為浮點數(shù)。
duration, err := strconv.ParseFloat(durationStr, 64)
//如果轉(zhuǎn)換失敗,則返回錯誤。
if err != nil {
return 0, err
}
//將浮點數(shù)時長轉(zhuǎn)換為整數(shù)(秒),并返回,沒有錯誤。
return int(duration), nil
}
return 0, fmt.Errorf("no duration found")
}
// formatDurationSeconds 函數(shù)將秒數(shù)轉(zhuǎn)換為分秒格式的字符串。
// 函數(shù)接收一個整數(shù)參數(shù) seconds,表示時長(秒)。
// 函數(shù)返回一個字符串,表示時分秒格式的時長。
func formatDurationSeconds(seconds int) string {
//計算時鐘數(shù),通過將總秒數(shù)除以3600。
hours := seconds / 3600
//計算分鐘數(shù),通過將總秒數(shù)除以60。
minutes := (seconds % 3600) / 60
//計算剩余的秒數(shù),通過取總秒數(shù)除以60的余數(shù)。
seconds = seconds % 60
//根據(jù)秒數(shù)自動判斷是否包含小時,并相應(yīng)地格式化輸出
if hours > 0 {
//根據(jù)秒數(shù)自動判斷是否包含分鐘,并相應(yīng)地格式化輸出
if minutes > 0 {
//使用 fmt.Sprintf 格式化分鐘和秒數(shù)為 "MM:SS" 格式的字符串,并確保分鐘和秒數(shù)都是兩位數(shù)(不足兩位時前面補0)。
return fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)
} else {
return fmt.Sprintf("%02d:%02d", hours, seconds)
}
} else if minutes > 0 {
return fmt.Sprintf("%02d:%02d", minutes, seconds)
} else {
return fmt.Sprintf("00:%02d", seconds)
}
}
func main() {
//定義音視頻文件的路徑,并替換為實際的文件路徑。
filePath := "/opt/www/nginx/html/pages/resource/input.mp3"
//調(diào)用 getDuration 函數(shù)獲取文件的時長(秒)。
durationSeconds, err := getDuration(filePath)
//如果在獲取時長時發(fā)生錯誤,則打印錯誤并退出程序。
if err != nil {
fmt.Println("Error getting duration:", err)
return
}
fmt.Println("Duration:", durationSeconds)
//調(diào)用 formatDurationSeconds 函數(shù)將時長(秒)轉(zhuǎn)換為時分秒格式的字符串。
durationFormatted := formatDurationSeconds(durationSeconds)
fmt.Printf("Duration: %s\n", durationFormatted)
}
到此這篇關(guān)于使用Golang獲取音視頻時長信息的示例代碼的文章就介紹到這了,更多相關(guān)Golang獲取時間長內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實現(xiàn)
本文主要介紹了go語言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Golang使用pprof和trace進行診斷和修復(fù)性能問題
在?Go?中,開發(fā)人員可以使用強大的內(nèi)置工具來幫助診斷和修復(fù)性能問題,其中兩個工具是?pprof?和?trace?包,下面就跟隨小編一起來了解下如何使用pprof和trace進行診斷和修復(fù)性能問題吧2024-01-01
Golang報“import cycle not allowed”錯誤的2種解決方法
這篇文章主要給大家介紹了關(guān)于Golang報"import cycle not allowed"錯誤的2種解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以們下面隨著小編來一起看看吧2018-08-08
Go語言實戰(zhàn)學(xué)習(xí)之流程控制詳解
這篇文章主要為大家詳細介紹了Go語言中的流程控制,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助?,需要的朋友可以參考下2022-08-08
Golang并發(fā)編程之main goroutine的創(chuàng)建與調(diào)度詳解
這篇文章主要為大家詳細介紹了Golang并發(fā)編程中main goroutine的創(chuàng)建與調(diào)度,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03

