CreateProcess завершается ошибкой, когда dshow используется в командной строке - PullRequest
5 голосов
/ 25 июня 2019

Попытка запустить ffmpeg с помощью CreateProcess.

Проблемы:

1) Невозможно использовать dshow в командной строке.

2) Потоковая передача RTMP по каналу STDIN не показывает поток.

Вопросы:

1) Что такое ceveats в командной строкеотносящиеся к API CreateProcess?

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);

Сбой CreateProcess при использовании dshow.Однако он работает как консольная строка в консоли.

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:\test\kites.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);  

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

Вы почти у цели. Вы можете указать абсолютный путь следующим образом. Убедитесь, что в имени папки нет пробелов, иначе команда ffmpeg может снова завершиться ошибкой. Если ffmpeg находится в другой папке, вы также должны указать путь.

std::wstring cmdArgslistSetChannel = L"c:\test\ffmpeg.exe -y -loop 1 -i \"c:\\test\\kites.jpg\"  -f dshow  -i audio=\"Stereo Mix(Realtek High Definition Audio)\"  out.mp4";
1 голос
/ 03 июля 2019

Во-первых,

Непосредственная проблема заключается в том, что вам нужно избежать обратной косой черты.

Изменение:

c:\test\kites.jpg 

К

c:\\test\\kites.jpg

«\ t» - это вкладка, а «\» - обратная косая черта

Второй,

из Комментарий :

Из CreateProcessW: "Юникодверсия этой функции CreateProcessW может изменять содержимое строки [lpCommandLine], поэтому этот параметр не может быть указателем на постоянную память (например, константную переменную или литеральную строку). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа. "

Поэтому вам необходимо хранить содержимое в буфере следующим образом:

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

Третий,

Если вы знаете полный путь к исполняемому файлу (который кажется), вы можете вместо этого указать его в первом параметре CreateProcess.Это даст вам немного больше контроля и диагностики (и в будущем), так как это более прямой способ создания процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...