Golang使用ffmpeg下载mp3文件失败问题求助
Golang使用ffmpeg下载mp3文件失败问题求助 我无法下载 bbc.mp3 文件。 你能告诉我如何修改我的代码吗?
package main
import
(
"fmt"
"os/exec"
)
func main () {
cmd := exec.Command("ffmpeg","-i http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_world_service/bbc_world_service.isml/bbc_world_service-audio%3d48000.norewind.m3u8 -t 300 -b:a 64k bbc.mp3")
err := cmd.Run()
if err != nil {
fmt.Println(err)
}
}
更多关于Golang使用ffmpeg下载mp3文件失败问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
解决方案是使用 Command 对象的 Stderr 属性。 代码大致如下:
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ffmpeg", "-i http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_world_service/bbc_world_service.isml/bbc_world_service-audio%3d48000.norewind.m3u8 -t 300 -b:a 64k bbc.mp3")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
}
更多关于Golang使用ffmpeg下载mp3文件失败问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题出在命令行参数传递方式上。exec.Command 需要将每个参数单独传递,而不是整个命令行字符串。以下是修正后的代码:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ffmpeg",
"-i", "http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_world_service/bbc_world_service.isml/bbc_world_service-audio%3d48000.norewind.m3u8",
"-t", "300",
"-b:a", "64k",
"bbc.mp3")
err := cmd.Run()
if err != nil {
fmt.Println("执行失败:", err)
return
}
fmt.Println("下载完成")
}
如果仍然失败,可以添加错误输出捕获来查看详细错误信息:
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ffmpeg",
"-i", "http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_world_service/bbc_world_service.isml/bbc_world_service-audio%3d48000.norewind.m3u8",
"-t", "300",
"-b:a", "64k",
"bbc.mp3")
var stderr bytes.Buffer
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Printf("执行失败: %v\n", err)
fmt.Printf("错误输出: %s\n", stderr.String())
return
}
fmt.Println("下载完成")
}
如果需要处理更复杂的场景,比如进度显示或超时控制:
package main
import (
"context"
"fmt"
"os/exec"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
cmd := exec.CommandContext(ctx, "ffmpeg",
"-i", "http://as-hls-ww-live.akamaized.net/pool_904/live/ww/bbc_world_service/bbc_world_service.isml/bbc_world_service-audio%3d48000.norewind.m3u8",
"-t", "300",
"-b:a", "64k",
"bbc.mp3")
output, err := cmd.CombinedOutput()
if err != nil {
if ctx.Err() == context.DeadlineExceeded {
fmt.Println("操作超时")
} else {
fmt.Printf("执行失败: %v\n", err)
fmt.Printf("输出: %s\n", output)
}
return
}
fmt.Println("下载完成")
}

