“我想将图像作为输入发送到 FFmpeg...我相信 FFmpeg 可以从管道接收图像,有谁知道这是怎么做到的完成了吗?”
是的,可以使用管道发送 FFmpeg 图像。使用standardInput 发送帧。帧数据必须是字节数组中未压缩的像素值(例如:24 位 RGB 格式),其中包含足够字节 (widthxheightx3) 以写入完整帧。
通常(在命令或终端窗口中)您将输入和输出设置为:
ffmpeg -i inputvid.mp4 outputvid.mp4.
但对于管道,您必须首先指定传入输入的宽度/高度和帧速率等。然后将传入输入文件名添加为 -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
在哪里...
完整的设置如下所示:
-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