是否可以通过管道发送ffmpeg图像?

Yan*_*hof 2 ffmpeg

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

我发现一些信息,据我所知表明这是可能的。-我相信ffmpeg可以从管道接收图像,有人知道该怎么做吗?

VC.*_*One 5

“我想将图像作为输入发送到FFmpeg ...我相信FFmpeg可以从管道接收图像,有人知道该怎么做吗?”

是的,可以通过管道发送FFmpeg图像。使用standardInput发送帧。帧数据必须是字节数组中未压缩的像素值(例如:24位RGB格式),该字节数组必须具有足够的字节(widthx heightx 3)来写入整个帧。

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

ffmpeg -i inputvid.mp4 outputvid.mp4

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

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

您管道的Process必须以以下参数开头:

-y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - ....etc
Run Code Online (Sandbox Code Playgroud)

哪里...

  • -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
Run Code Online (Sandbox Code Playgroud)

如果您收到块状视频输出,请尝试设置两个输出文件...

-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
Run Code Online (Sandbox Code Playgroud)

这将输出一个测试h264视频文件,您以后可以将其放入MP4容器中。
音轨-i someTrack.mp3是可选的。

-i myH264vid.h264 -i someTrack.mp3 outputVid.mp4
Run Code Online (Sandbox Code Playgroud)