В моем приложении есть функция захвата захваченных изображений и использования фонового редактора 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 из копии, которая была вручную размещена в другом месте (я использовал тот же файл), и это на самом деле работает. По какой-то причине кажется, что он просто не будет работать там, где его устанавливает мое приложение.