Vb.net 通过STDIN以编程方式向ffmpeg发送字节以创建静态图像文件
我试图使用vb.net代码将单个像素信息作为字节发送到ffmpeg,目的是保存一个静止的DPX图像文件。我已经成功地读取了DPX文件,并通过STDOUT将它们输出到vb.net代码中 管道电影文件似乎有很多例子,但也存在差异,例如一些人使用image2pipe,而另一些人使用rawvideo。我不确定什么时候该用一个而不是另一个。我尝试过的各种方法导致ffmpeg返回错误,例如“数据包对于DPX头太小”或“解码流时出错#0:0:处理输入时发现无效数据”。据我所知,我不提供标题,只提供原始单个像素RGBRGBRGB。。。。值作为字节数组 通过命令行发送到ffmpeg的参数有: -f image2pipe-pix_fmt rgb24-s 16x16-bits_per_raw_样本8-c:v dpx-i-\MyPath\MyFilename.dpx 我的vb.net代码如下:Vb.net 通过STDIN以编程方式向ffmpeg发送字节以创建静态图像文件,vb.net,ffmpeg,stdin,Vb.net,Ffmpeg,Stdin,我试图使用vb.net代码将单个像素信息作为字节发送到ffmpeg,目的是保存一个静止的DPX图像文件。我已经成功地读取了DPX文件,并通过STDOUT将它们输出到vb.net代码中 管道电影文件似乎有很多例子,但也存在差异,例如一些人使用image2pipe,而另一些人使用rawvideo。我不确定什么时候该用一个而不是另一个。我尝试过的各种方法导致ffmpeg返回错误,例如“数据包对于DPX头太小”或“解码流时出错#0:0:处理输入时发现无效数据”。据我所知,我不提供标题,只提供原始单个像素
Dim P As New Process
P.StartInfo.FileName = m_FFMPEGExecutable_PathFile
P.StartInfo.Arguments = (see above arguments)
P.StartInfo.UseShellExecute = False
P.StartInfo.CreateNoWindow = True
P.StartInfo.RedirectStandardInput = True
p.Start
'Test image: A single red, green, blue, black and white pixel followed by all black
Dim Tiny((16 * 16) - 1) As Byte
Tiny(0) = 255
Tiny(1) = 0
Tiny(2) = 0
Tiny(3) = 0
Tiny(4) = 255
Tiny(5) = 0
Tiny(6) = 0
Tiny(7) = 0
Tiny(8) = 255
For i As byte = 9 To ((16x16)-1)
Tiny(i) = 255
Next
'Send the rgb byte array to ffmpeg:
P.StandardInput.BaseStream.Write(Tiny, 0, Tiny.Length)
P.StandardInput.Flush()
P.StandardInput.Close()
我尝试了上述ffmpeg参数的许多变体,但似乎无法避免这些错误。如果您有任何建议,包括关于何时使用image2pipe与rawvideo的信息,我们将不胜感激。既然您发送的是原始比特流,请使用rawvideo。删除
-c:v dpx
您能解释一下原始比特流和image2pipe之间的区别吗?据我所知,两者都是r、g、b、字节流?原始比特流没有任何元数据。image2pipe可用于发送JPEG、PNG等容器格式..etcGyan,我按照您的建议做了(使用了rawvideo而不是image2pipe,并从参数中删除了“-c:v dpx”。这导致了略有不同的错误....pipe::流0中的输入数据包损坏[rawvideo@00000 25EBF58E0C0]缓冲区大小无效,数据包大小256<解码流时预期帧大小768错误#0:0:参数无效对于格式为rgb24的16x16图像,您应发送16x16x3字节。每个三元组中的第一个字节是R,然后是G,然后是B。您似乎只发送256字节。