我是 Go 的新手!

我正在做一个简单的测试,即从 ffmpeg 读取输出并写入文件。

我知道我可以用不同的方式做到这一点,只需转换,但这是一个项目的开始,我想稍后操作读取的字节,更改它们,然后将它们发送到输出。输入将是 UDP,输出也将是 UDP,也就是说,我将获得 ffmpeg 输出,我将按我希望的方式处理字节,然后将这些字节作为输入扔到另一个 ffmpeg 进程中,输出是 UDP 作为好吧。

通过这个简单的测试,文件的结果没有在 VLC 中运行,我相信我在输出文件中正确写入字节,但输出文件总是比输入文件小 1MB。

我需要一些帮助来阐明编写我正在做的这个测试的最佳方法是什么,基于此我可以离开这个地方。我不知道它是否完全错误,但我的印象是它是错误的。

输入文件是 4K 视频,h264,我相信输出应该是一样的,因为在这个简单的测试中,我只是简单地读取 cmd 写入文件的内容。

按照代码进行分析:

package main

import (
    "os/exec"
    "os"
)

func verificaErro(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    dir, _ := os.Getwd()

    cmdName := "ffmpeg"
    args := []string{
        "-hide_banner",
        "-re",
        "-i",
        dir + "\\teste-4k.mp4",
        "-preset",
        "superfast",
        "-c:v",
        "h264",
        "-crf",
        "0",
        "-c",
        "copy",
        "-f", "rawvideo", "-",
    }
    cmd := exec.Command(cmdName, args...)

    stdout, err := cmd.StdoutPipe()
    verificaErro(err)
    err2 := cmd.Start()
    verificaErro(err2)

    fileOutput := dir + "/out.raw"
    var _, err3 = os.Stat(fileOutput)

    if os.IsNotExist(err3) {
        var file, err = os.Create(fileOutput)
        verificaErro(err)
        defer file.Close()
    }

    f, err4 := os.OpenFile(dir+"/out.raw", os.O_RDWR|os.O_APPEND, 0666)

    verificaErro(err4)

    bytes := make([]byte, 1024)
    for {
        _, err5 := stdout.Read(bytes)
        if err5 != nil {
            continue
        }
        if len(bytes) > 0 {
            _, err6 := f.Write(bytes)
            verificaErro(err6)
        } else {
            break
        }
    }

    f.Close()
}