当命令行中使用DShow时,CreateProcess失败

CreateProcess fails when dshow is used in commandline

本文关键字:CreateProcess 失败 DShow 命令行      更新时间:2023-10-16

尝试使用CreateProcess启动FFMPEG。

问题:

1(在命令行中无法使用dshow

2(带有stdin管道的rtmp流式流式流式流动。

问题:

1(命令行中的CEVEAT与CreateProcess API有关?

2(回合的道路是什么?该问题如何解决?

此代码有效:

BOOL bSuccess = CreateProcess(NULL,
    L"ffmpeg.exe -y -loop 1 -i kites.jpg  out.mp4",         
    NULL,   
    NULL,
    TRUE, 
    CREATE_NEW_CONSOLE, 
    NULL, 
    NULL,
    &siStartInfo,
    &piProcInfo);

使用dshow时createProcess失败。但是它用作控制台中的命令行。

BOOL bSuccess = CreateProcess(NULL,
    L"ffmpeg.exe -y -loop 1 -i kites.jpg  -f dshow  -i audio="Stereo Mix(Realtek High Definition Audio)"  out.mp4",
    NULL,
    NULL,
    TRUE,
    CREATE_NEW_CONSOLE,
    NULL,
    NULL,
    &siStartInfo,
    &piProcInfo);

编辑:(带有绝对路径,仍然没有运气(

std::wstring cmdArgslistSetChannel = L"ffmpeg.exe -y -loop 1 -i c:testkites.jpg  -f dshow  -i audio="Stereo Mix(Realtek High Definition Audio)"  out.mp4";
bSuccess = CreateProcess(NULL, 
        &cmdArgslistSetChannel[0],
        NULL,          
        NULL,          
        TRUE,          
        CREATE_NEW_CONSOLE,            
        NULL,          
        NULL,          
        &siStartInfo, 
        &piProcInfo);  

您几乎在那里。您可以这样指定绝对路径。确保文件夹名称中没有空格,否则ffmpeg命令可能会再次失败。如果ffmpeg位于另一个文件夹中,则也应该指定路径。

std::wstring cmdArgslistSetChannel = L"c:testffmpeg.exe -y -loop 1 -i "c:\test\kites.jpg"  -f dshow  -i audio="Stereo Mix(Realtek High Definition Audio)"  out.mp4";

首先,

直接的问题仅仅是您需要逃脱反闪烁。

更改:

c:testkites.jpg 

to

c:\test\kites.jpg

' t'是一个选项卡,''是backslash

第二,

来自评论:

来自CreateProcessw:"此功能的Unicode版本, CreateProcessw,可以修改[lpcommandline]字符串的内容。 因此,此参数不能是通向只读内存的指针 (例如const变量或文字字符串(。如果此参数是 恒定字符串,该功能可能会导致访问违规。"

因此,您需要在这样的缓冲区中握住内容:

std::wstring args{L"c:testffmpeg.exe -y -loop 1 -i "c:\test\kites.jpg"  -f dshow  -i audio="Stereo Mix(Realtek High Definition Audio)"  out.mp4"};

第三,

如果您知道可执行文件的完整路径(看起来(,则可以将其放入CreateProcess的第一个参数中受益。这将为您提供更多的控制和诊断(将来(,因为它是创建过程的更直接的方法。