【发布时间】:2018-09-22 20:32:20
【问题描述】:
我有一个直接来自 http 正文的 [] 字节格式的视频:
//Parsing video
videoData, err := ioutil.ReadAll(r.Body)
if err != nil {
w.WriteHeader(UPLOAD_ERROR)
w.Write([]byte("Error uploading the file"))
return
}
我需要一帧视频并将其转换为 png。这就是有人使用 ffmpeg 处理静态和编码文件的方式:
filename := "test.mp4"
width := 640
height := 360
cmd := exec.Command("ffmpeg", "-i", filename, "-vframes", "1", "-s", fmt.Sprintf("%dx%d", width, height), "-f", "singlejpeg", "-")
var buffer bytes.Buffer
cmd.Stdout = &buffer
if cmd.Run() != nil {
panic("could not generate frame")
}
如何使用原始视频实现相同的效果?
reddit 的一位用户告诉我,我可以通过 https://ffmpeg.org/ffmpeg-protocols.html#pipe 实现这一目标,但我找不到任何资源。
感谢您的帮助。
(编辑:我现在尝试将 []byte 数组通过管道传输到 ffmpeg,但 ffmpeg 没有填充我的缓冲区:
width := 640
height := 360
log.Print("Size of the video: ", len(videoData))
cmd := exec.Command("ffmpeg", "-i", "pipe:0", "-vframes", "1", "-s", fmt.Sprintf("%dx%d", width, height), "-f", "singlejpeg", "-")
cmd.Stdin = bytes.NewReader(videoData)
var imageBuffer bytes.Buffer
cmd.Stdout = &imageBuffer
err := cmd.Run()
if err != nil {
log.Panic("ERROR")
}
imageBytes := imageBuffer.Bytes()
log.Print("Size of the image: ", len(imageBytes))
但我收到以下错误:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff05d002600]流0,偏移0x5ded:部分文件
pipe:0:处理输入时发现无效数据
在没有任何数据写入的情况下完成流 0:0。
帧= 0 fps=0.0 q=0.0 Lsize= 0kB 时间=-577014:32:22.77 比特率= -0.0kbits/s 速度=N/A 视频:0kB 音频:0kB 字幕:0kB 其他流:0kB 全局标题:0kB 复用开销:未知
输出文件为空,未编码(检查 -ss / -t / -frames 参数是否使用)
【问题讨论】:
-
cmd.Stdin = bytes.NewReader(videoData),并将文件名替换为“pipe:0” -
这是您的 previous question 的副本,更具体一点。
-
@icza 不,不是。在这个问题中,我特别询问如何将字节推送到 ffmpeg。这两个问题可能相关,但基础不同。
-
要知道你需要多少字节需要你解码视频,此时你可能不再需要 ffmpeg。但我希望 ffmpeg 在第一帧之后停止阅读。您可以使用io.TeeReader 来判断 ffmpeg 读取了多少。如果事实证明 ffmpeg 可以读取所有内容,io.LimitReader 可能会有所帮助。
-
@Peter 或者而不是
io.LimitReader只是切片输入数据,例如bytes.NewReader(videoData[:limit])(但不要忘记检查切片长度以避免运行时恐慌)。