“我想要发送图像作为输入到 FFmpeg...我相信 FFmpeg 可以接收图像从管道,有人知道如何做到这一点吗?”
是的,可以使用管道发送 FFmpeg 图像。使用standardInput
发送帧。帧数据必须是保存足够字节的字节数组中的未压缩像素值(例如:24位RGB格式)(width
xheight
x3
)来写一个完整的框架。
通常(在命令或终端窗口中)您将输入和输出设置为:
ffmpeg -i inputvid.mp4 outputvid.mp4
.
但对于管道你必须first指定传入输入的宽度/高度和帧速率等。然后将传入输入文件名添加为-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
Where...
-f rawvideo -pix_fmt argb
意味着接受未压缩的RGB 数据。
-s 800x600
and -r 25
是示例输入width & height, r
sets 帧率这意味着 FFmpeg 必须对每秒钟编码这么多图像output video.
完整的设置如下所示:
-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
如果您的视频输出出现块状,请尝试设置two输出文件...
-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