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("下载完成")
}
回到顶部