【问题标题】:is it possible to send ffmpeg images by using pipe?是否可以使用管道发送 ffmpeg 图像?
【发布时间】:2018-08-18 23:18:00
【问题描述】:

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

根据我的理解,我发现了一些信息表明这是可能的。 - 我相信 ffmpeg 可以从管道接收图像,有谁知道如何做到这一点?

【问题讨论】:

  • 基本语法是process-piping-images | ffmpeg -f image2pipe -i - output

标签: ffmpeg


【解决方案1】:

“我想将图像作为输入发送到 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

在哪里...

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

  • -s 800x600-r 25 是示例输入 width & heightr 设置 frame rate 表示 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

【讨论】:

  • 您好!谢谢你的精彩回答。我遇到了一个问题......我已按照您给出的所有说明进行操作,但在我写入任何数据之前,我收到了“管道关闭”错误。你有什么建议让我遵循/检查吗?谢谢!
  • 什么编程语言说“管道关闭”?您必须在代码中将 Ffmpeg 应用程序作为外部 Process 运行,这将在代码的函数和变量之间建立一个管道(连接)到从终端运行的 FFmpeg 应用程序(如果以 @ 运行,可能会给用户提供不可见的窗口987654342@).
  • 我使用了你的命令行建议,我得到了x264 [error]: baseline profile doesn't support 4:4:4。如果输入 -pix_fmtargb,我认为还需要其他东西。
  • 你不能在 H264 (Mpeg) 中使用颜色空间 YUV 444,它应该是 420。设置基线后尝试添加像素格式,eg-y -f rawvideo -pix_fmt argb -s 800x600 -r 25 -i - -c:v libx264 -profile:v baseline -pix_fmt yuv420p -level...etc
  • @VC.One 好的,我已经修复了错误。我的意思是说 FFMPEG 显示“管道关闭”错误,IIRC。我想我已经设置了ProcessStartInfo.UseShellExecute = False,因此它允许我重定向流。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2021-07-06
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多