我想将图像作为输入发送到ffmpeg,并且我希望ffmpeg将视频输出到流(webRtc格式。)
我发现一些信息表明,根据我的理解,这是可能的。 -我相信ffmpeg可以从管道接收图像,有人知道该怎么做吗?
答案 0 :(得分:2)
“我想将图像作为输入发送到FFmpeg ...我相信FFmpeg可以从管道中接收图像 ,有人知道怎么做吗?完成吗?”
是的,可以通过管道发送FFmpeg图像。使用standardInput
发送帧。帧数据必须是字节数组中未压缩的像素值(例如:24位RGB格式),该字节数组必须具有足够的字节(width
x height
x 3
)来写完整的帧。>
通常(在“命令”或“终端”窗口中)将输入和输出设置为:
ffmpeg -i inputvid.mp4 outputvid.mp4
。
但是对于管道,您必须首先指定输入输入的宽度/高度和帧频等。然后将输入输入文件名添加为-i -
(其中使用空白的{{1} },这意味着FFmpeg监视-
连接中是否有传入的原始像素数据。
您必须将帧数据放入某些Bitmap对象中,并将位图值作为字节数组发送。每次发送将被编码为一个新的视频帧。伪代码示例:
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
表示接受未压缩 RGB数据。
-f rawvideo -pix_fmt argb
和-s 800x600
是示例输入 width 和 height ,-r 25
设置了帧速率< / em>表示FFmpeg必须在每秒输出视频中编码此数量的图像。
完整的设置如下:
r
如果视频输出阻塞,请尝试设置两个输出文件...
-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
视频文件,您可以稍后将其放入MP4容器中。
音轨h264
是可选的。
-i someTrack.mp3