0

ソケットから h264 データを読み取り、それを h264dec.exe ( openh264 デコーダー) に渡し、YUV データを YUV-RGB デコーダーに渡すコードを書いています。私の問題は、openh264dec が「h264dec video.h264 out.yuv」のように機能することです。

また、コード内で引数を処理してストリームとして提供する方法もよくわかりません。トレーニング目的で試してみましh264dec video.h264 \\.\pipe\h264inputたが、機能しません。コードは次のとおりです。

NamedPipeServerStream pipeServ = new NamedPipeServerStream(Utility.DecoderOutputPipeName, PipeDirection.InOut);

Openh264.Openh264 openh264 = new Openh264.Openh264();
openh264.Start();
pipeServ.WaitForConnection();
Openh264.YUVDecoder decoder = new Openh264.YUVDecoder(pipeServ, 640, 480);
decoder.NewFrame += Decoder_NewFrame;
decoder.Start();

プロセスは次のとおりです。

public Openh264()
{
    string args;
    //args = @" \\.\pipe\" + Utility.DecoderInputPipeName;
    args = @"C:\test\vid.h264";
    args += @" \\.\pipe\" + Utility.DecoderOutputPipeName;
    openh264 = new Process();
    openh264.StartInfo.CreateNoWindow = true;
    openh264.StartInfo.UseShellExecute = false;
    openh264.StartInfo.FileName = "h264dec.exe";
    openh264.StartInfo.Arguments = args;
}

YUV デコーダーは、入力ストリーム オブジェクトとして、幅と高さを受け取ります。プログラムがハングアップしWaitForConnection()、その機能がないとYUV、ストリームからの読み取り中にデコーダーが例外をスローします。

このように機能させることさえ可能ですか?引数をパイプで置き換えますか?

4

1 に答える 1

0

Openh264 ソース コードを読みましたが、この特定の状況で理解していることから、処理のためにファイル全体をメモリにロードしようとするため、ファイル引数をパイプに置き換えることはできません。

if (fread (pBuf, 1, iFileSize, pH264File) != (uint32_t)iFileSize) {
    fprintf (stderr, "Unable to read whole file\n");
    goto label_exit;
  }

そこで、ffmpeg に切り替えることにしました。完全に動作します。

class FFmpeg
{
    Process ffmpeg;

    public FFmpeg()
    {
        String args = "";
        ffmpeg = new Process();
        ffmpeg.StartInfo.CreateNoWindow = true;
        ffmpeg.StartInfo.UseShellExecute = false;
        ffmpeg.StartInfo.RedirectStandardInput = true;
        ffmpeg.StartInfo.RedirectStandardOutput = true;
        ffmpeg.StartInfo.FileName = @"C:\test\ffmpeg.exe";
        args = @" -i C:\test\video.h264 -c:v rawvideo -pix_fmt yuv420p -f rawvideo -";
        ffmpeg.StartInfo.Arguments = args;
    }

    public void Start()
    {
        ffmpeg.Start();
    }

    public void End()
    {
        ffmpeg.Kill();
    }

    public BinaryWriter InputStream
    {
        get
        {
            return new BinaryWriter(ffmpeg.StandardInput.BaseStream);
        }
    }

    public Stream OutputStream
    {
        get
        {
            return ffmpeg.StandardOutput.BaseStream;
        }
    }
}

使用例:

        FFmpeg.FFmpeg ffmpeg = new FFmpeg.FFmpeg();
        ffmpeg.Start();
        Utils.YUVDecoder decoder = new Utils.YUVDecoder(ffmpeg.OutputStream, 640, 480);
        decoder.NewFrame += Decoder_NewFrame;
        decoder.Start();
于 2015-12-22T14:33:38.143 に答える