我刚接触Go语言!
我正在进行一个简单的测试,读取来自ffmpeg的输出并写入文件。
我知道我可以用不同的方式来完成这个任务,但这只是项目的开始。我想以后操作读取的字节,对它们进行更改,然后将它们发送到另一个输出为UDP的ffmpeg进程中。输入也是UDP,也就是说,我会处理ffmpeg的输出,将其字节按照我的意愿进行处理,然后将这些字节作为输入传递给另一个输出为UDP的ffmpeg进程。
在这个简单的测试中,生成的文件无法在VLC中播放。我相信我已经正确地将字节写入输出文件,但是输出文件始终比输入文件少1MB。
我希望能够得到一些帮助,阐明我正在做的测试的最佳方法,以便我能够摆脱困境。我不知道是否完全有错,但我有这种感觉。
输入文件是4K H264视频,我认为输出应该是相同的,因为在这个简单的测试中,我仅仅是读取了命令行中的输出并将其写入文件中。
以下是代码:
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()
}