【问题标题】:Piping images to FFmpeg stdin将图像管道传输到 FFmpeg 标准输入
【发布时间】:2019-05-17 18:37:31
【问题描述】:

早上好,我需要通过 hls 流式传输文件夹中的许多图像,就好像它们是视频帧一样。我事先不知道它们有多少,所以我相信我需要保持 FFmpeg 打开并通过标准输入传递它们。我已经读过这篇文章 create video from growing image sequence 我更改了 c# 代码以适应我的问题:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.ComponentModel;
namespace Example
{
public class Example
{

static void Main()
{

    AsyncMain().GetAwaiter().GetResult();
}

static async Task AsyncMain()
{
    Console.WriteLine("Press any button to quit.");
    var maintask = RunFFMPEG();
    var readtask = Task.Run(() => Console.Read());
    await Task.WhenAny(maintask, readtask);
}



static async Task RunFFMPEG()
{
    await Task.Run(() =>
    {
        const int fps = 30;
        const string outfile = "video_seg_%05d.ts";
        const string dir = @"C:\Users\funny\Desktop\in\";
        const string pattern = "{0}.bmp";
        const string path = dir + pattern;
        const string args = "-y -re -f image2pipe -framerate 2 -i - -c:v libx264 -r {0} -s 1920x1200 -b:v 256000 -flags +global_header -map 0 -f segment -segment_time 10 -segment_list_size 0 -segment_list list.m3u8 -segment_format mpegts {1}";
        const int startNum = 0;
        const int endNum = 100;

   var pinf = new ProcessStartInfo("ffmpeg", string.Format(args, fps, outfile));
        pinf.UseShellExecute = false;
        pinf.RedirectStandardInput = true;
        pinf.WorkingDirectory = dir;         

        Console.WriteLine("Starting ffmpeg...");
        var proc = Process.Start(pinf);
        using (var stream = new BinaryWriter(proc.StandardInput.BaseStream))
        {
            for (var i = startNum; i < endNum; i++)
            {
               var file = string.Format(path, i.ToString("D4"));
                System.Threading.SpinWait.SpinUntil(() => File.Exists(file) && CanReadFile(file));
                Console.WriteLine("Found file: " + file);
                stream.Write(File.ReadAllBytes(file));
            }
        }

 proc.WaitForExit();
        Console.WriteLine("Closed ffmpeg.");
    });
}


    static bool CanReadFile(string file)
    {
        //Needs to be able to read file
        FileStream fs = null;
        try
        {
            fs = File.OpenRead(file);
            return true;
        }
        catch (IOException)
        {
            return false;
        }
        finally
        {
            if (fs != null)
                fs.Close();
        }
    }


}
}

当我运行脚本时,我会看到以下屏幕:

Press any button to quit.
Starting ffmpeg...
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181017
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100

即使我的文件夹中有图像并且它们不断出现,它也会保持这种状态。谁能告诉我为什么不处理? (我尝试在没有管道的情况下单独对固定数量的图像运行 FFmpeg 命令,它可以工作。)

【问题讨论】:

  • 你的代码能找到图片吗?它在控制台上输出什么(如果有的话)?请尝试逐步解决您的代码问题,确保您知道它正在做它应该做的事情。
  • 好吧,我不太喜欢 C#,所以我认为代码是正确的,但由于它不显示“找到的文件”,在此之前有些问题。控制台输出有问题。要么是 for cyle 要么是 binarywriter 错了,但我不知道在哪里。
  • 您不必使用 C#,当然任何其他语言都允许您这样做。但是,如果它没有找到文件,您必须通过调试代码或插入更多打印语句来检查它正在寻找的路径或模式。

标签: c# ffmpeg pipe


【解决方案1】:

我找到了问题的解决方案:基本上代码无法读取图像,因为路径输入错误;我换行了

var file = string.Format(path, i.ToString("D4"));

进入

var file = string.Format(string.Format(path,i), i.ToString("D4"));

它解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2022-07-05
    • 2019-09-11
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多