是否可以使用管道发送ffmpeg图像?

是否可以使用管道发送ffmpeg图像?,ffmpeg,Ffmpeg,我希望将图像作为输入发送到ffmpeg,并希望ffmpeg将视频输出到流(webRtc格式) 我发现一些信息表明这是可能的我相信ffmpeg可以从管道接收图像,有人知道如何做到这一点吗 “我想将图像作为输入发送到FFmpeg。我相信FFmpeg可以从管道接收图像,有人知道如何做到这一点吗?” 是的,可以使用管道发送FFmpeg图像。使用标准输入发送帧。帧数据必须是字节数组中未压缩的像素值(例如:24位RGB格式),该字节数组包含足够的字节(widthxheightx3) 通常(在命令或终端窗口中

我希望将图像作为输入发送到ffmpeg,并希望ffmpeg将视频输出到流(webRtc格式)

我发现一些信息表明这是可能的我相信ffmpeg可以从管道接收图像,有人知道如何做到这一点吗

“我想将图像作为输入发送到FFmpeg。我相信FFmpeg可以从管道接收图像,有人知道如何做到这一点吗?”

是的,可以使用管道发送FFmpeg图像。使用
标准输入
发送帧。帧数据必须是字节数组中未压缩的像素值(例如:24位RGB格式),该字节数组包含足够的字节(
width
x
height
x
3

通常(在命令或终端窗口中)将输入和输出设置为:

ffmpeg
-i inputvid.mp4 outputvid.mp4

但对于管道,您必须首先指定传入输入的宽度/高度和帧速率等。然后aso将传入输入文件名添加为
-i-
(其中使用空白
-
,这意味着FFmpeg监视传入原始像素数据的
standardInput
连接

必须将帧数据放入某个位图对象中,并将位图值作为字节数组发送。每次发送都将编码为新的视频帧。伪代码示例:

public function makeVideoFrame ( frame_BMP:Bitmap ) : void
{
    //# Encodes the byte array of a Bitmap object as FFmpeg video frame
    if ( myProcess.running == true )
    {
        Frame_Bytes = frame_BMP.getBytes(); //# read pixel values to a byte array
        myProcess.standardInput.writeBytes(Frame_Bytes); //# Send data to FFmpeg for new frame encode

        Frame_Bytes.clear(); //# empty byte array for re-use with next frame

    }
}
无论何时使用新像素信息更新位图,都可以通过将位图作为输入参数发送到上述函数,将其作为新帧写入,例如
makeVideoFrame(my_new_frame_BMP);

管道的进程必须从以下参数开始:

-y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - ....etc
在哪里

  • -f rawvideo-pix_fmt argb
    表示接受未压缩的RGB数据

  • -s 800x600
    -r 25
    是示例输入宽度和高度,
    r
    设置帧速率意味着FFmpeg必须在输出视频的每秒钟对该数量的图像进行编码

完整设置如下所示:

-y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - -c:v libx264 -profile:v baseline -level:v 3 -b:v 2500 -an out_vid.h264
如果您获得块状视频输出,请尝试设置两个输出文件

-y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - -c:v libx264 -profile:v baseline -level:v 3 -b:v 2500 -an out_tempData.h264 out_vid.h264
这将输出一个测试
h264
视频文件,您可以稍后将其放入MP4容器中。
音频曲目
-i someTrack.mp3
是可选的

-i myH264vid.h264 -i someTrack.mp3 outputVid.mp4

基本语法是
processpiping images | ffmpeg-f image2pipe-i-output
Hello!感谢您的精彩回答。我面临一个问题……我已经按照您给出的所有说明进行了操作,但是我得到了一个“管道关闭”的提示在我写任何数据之前都会出错。你有什么提示让我遵循/检查吗?谢谢!什么编程语言说“管道关闭”?你必须在代码内部以外部
进程运行Ffmpeg应用程序,原子会形成管道(连接)在代码的函数和变量之间,指向从终端运行的FFmpeg应用程序(如果以
进程运行,可能会给用户提供不可见的窗口)。我使用了您的命令行建议,得到
x264[错误]:基线配置文件不支持4:4:4
。我认为如果输入
-pix\u fmt
argb
,则需要其他内容。您不能在H264(Mpeg)中使用颜色空间YUV 444,应该是420。在设置基线后尝试添加像素格式,例如:
-y-f rawvideo-pix_fmt argb-s 800x600-r 25-i--c:v libx264-profile:v基线-pix_fmt yuv420p-level…等等
@VC。好的,我已经修复了错误。我本想说FFMPEG显示“管道关闭”错误,IIRC。我想我已经设置了
ProcessStartInfo.UseShellExecute=False
,因此它允许我重定向流。