Фоновый рабочий ffmpeg работает в режиме отладки, но не в приложении - PullRequest
0 голосов
/ 01 ноября 2019

В моем приложении есть функция захвата захваченных изображений и использования фонового редактора FFmpeg для их вставки в замедленное видео. Графический интерфейс имеет несколько простых параметров для качества видео, а также для исходной папки и выходного файла. У меня была более старая версия моего приложения, написанная на VB.NET, и она работала без проблем, но я переписываю в C #, поскольку она поддерживает дополнительные возможности захвата и фильтрации при обработке изображений, но у меня возникают реальные проблемы с выяснением, что не так с этой функцией.

Я попытался переместить FFmpeg в другое место на случай, если это была проблема с разрешениями, но это не имело никакого эффекта, и я также попытался поместить функцию в «попытку» с окном сообщения для вывода любых исключений, но яполучил разные ошибки, которые не позволили мне скомпилировать код. Когда я запускаю приложение из VS 2015 в инструменте отладки, функция работает очень хорошо, и она создает видео из коллекции неподвижных изображений, но когда я создаю и устанавливаю приложение, оно не работает вообще, и я не могу видеть, чтовызывая его провал. В опциях для ffmpeg я использовал -report для вывода журнала о том, что происходит в фоновом режиме и при отладке, он создает этот журнал, но не из приложения, поэтому я не предполагаю, что он даже не запускает ffmpeg и сразу переходит кзавершенный этап функции.

Function startConversion()

    CheckForIllegalCrossThreadCalls = False
    Dim quality As Integer = trbQuality.Value
    Dim input As String = tbFolderOpen.Text
    Dim output As String = tbFolderSave.Text
    Dim exepath As String = Application.StartupPath + "\\bin\ffmpeg.exe"
    input = input & "\SCAImg_%1d.bmp"
    input = Chr(34) & input & Chr(34)
    output = Chr(34) & output & Chr(34)

    Dim sr As StreamReader
    Dim ffmpegOutput As String

    ' all parameters required to run the process
    proc.StartInfo.UseShellExecute = False
    proc.StartInfo.CreateNoWindow = True
    proc.StartInfo.RedirectStandardError = True
    proc.StartInfo.FileName = exepath
    proc.StartInfo.Arguments = "-framerate 25 -start_number 0 -pattern_type sequence -framerate 10 -i " & input & " -r 10 -c:v libx264 -preset slow -crf " & quality & " " & output
    proc.Start()

    lblInfo.Text = "Conversion in progress... Please wait..."
    sr = proc.StandardError 'standard error is used by ffmpeg
    btnMakeVideo.Enabled = False
    Do
        ffmpegOutput = sr.ReadLine
        tbProgress.Text = ffmpegOutput
    Loop Until proc.HasExited And ffmpegOutput = Nothing Or ffmpegOutput = ""

    tbProgress.Text = "Finished !"
    lblInfo.Text = "Completed!"
    MsgBox("Completed!", MsgBoxStyle.Exclamation)
    btnMakeVideo.Enabled = True
    Return 0

End Function

Я проверил папку приложения и она содержит подпапку \ bin с файлом ffmpeg.exe, расположенным в папке, поэтому я использовал cmd для запуска экземпляра установленногоffmpeg из папки приложения, и он, похоже, выбрасывает ошибки прав доступа:

Не удалось открыть отчет "ffmpeg-20191101-191452.log": разрешение отклонено Не удалось установить значение '1' для параметра 'report':Permission denied Ошибка синтаксического анализа глобальных опций: Permission denied

В таком случае кажется, что это проблема с разрешениями, но я не уверен. Я не сталкивался с этой ошибкой при использовании VB.NET, поэтому мне интересно, где я сейчас иду не так. Я подумал, что, возможно, это будет просто разрешение на запись в папку приложения, поэтому я удалил -report и снова запустил ffmpeg, используя cmd из папки приложения, а затем выдал ошибку

C: \ Users \ CEAstro \Pictures \ AnytimeCap: В доступе отказано

Я упустил что-то действительно очевидное в моем коде или есть что-то более фундаментальное, что я ошибся в своей настройке?

Я должен также добавить, что я пытался запустить ffmpeg черезCMD из копии, которая была вручную размещена в другом месте (я использовал тот же файл), и это на самом деле работает. По какой-то причине кажется, что он просто не будет работать там, где его устанавливает мое приложение.

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