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

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

通过这个简单的测试,文件的结果不会在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() 
}