0

我需要传递一个字符串到ProcessStartInfo ffmpeg,以便我可以调用dim.Argument,并让它在代码中追加字符串和变量,当我解析文件时。&运算符字符串错误与processStartInfo的参数字符串

我有当前的filename.mp3代码在movedFileInfo看到,但它不会允许我使用&运算符将其附加到字符串...帮助?

我知道可能有另外一种方法来利用单独函数中的ffmpeg命令来简单地循环使用“for”目录但我还没有找到一个成功的命令来运行我的ffmpeg.exe或ffprompt在窗口中。我还需要在写入merge.txt时附加回车符,但找不到示例...我是vba新手。

这些命令的工作,但vba抱怨我的字符串&运营商与错误The operator '&' is not defined for types 'String' and 'System.IO.FileInfo'错误。

所以我所理解的是我传递到psi.Arguments的字符串不喜欢我发送一个字符串和使用&运算符附加的变量的事实......我只是简单地使用逗号或如何将变量movedFileInfo附加到ffmpeg -i? psi的定义如上ProcessStartInfo ...所以我不知道什么类型的VB认识它...我还没有找到ProcessStartInfo信息启动我的ffmpeg EXE。

见下文代码:

Imports System 
Imports System.IO 
Imports System.Text.RegularExpressions 


Public Class Form1 

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 

     'videos are from SD card always on I:\Private\AVCHD\BDMV\STREAM\ 
     'store files to RAID drives in folders structured as : 
     '  F:\BUILD\FLIGHT#\CAM#\<TAIL_NUMBER>_FLT_<FLT_NUMBER>_UTC_<START_UTC_TIME>_CAM_<CAM_NUMBER>.MTS 

     'set base dir as directory F:\ 
     Dim dir As String = "C:\" 
     Dim video_card_dir As String = "C:\1bak\" '"I:\Private\AVCHD\BDMV\STREAM\" 
     Directory.SetCurrentDirectory(dir) 

     Dim new_flightnum_directory = dir & Me.BUILD.Text & "\" & FLT.Text & "\" 
     'establish new video dir> F: \ BUILD  \  FLIGHT # \    CAM # \ 
     Dim new_video_directory = dir & Me.BUILD.Text & "\" & FLT.Text & "\" & Me.CAM.Text & "\" 
     'establish new filename to rename the video file 
     '        TAIL #    FLT # 
     Dim new_filename As String = TAIL.Text & "_" & FLT.Text & "_" & UTC.Text & "_" & CAM.Text 
     Dim ffmpeg As String = "C:\ffmpeg\bin\ffmpeg.exe" 
     '****FFMPEG required variables 
     Dim psi As ProcessStartInfo = New ProcessStartInfo("C:\ffmpeg\bin\ffmpeg.exe") 
     Dim proc As Process = Process.Start(psi) 

     psi.UseShellExecute = True 
     psi.CreateNoWindow = True 
     '****end FFMPEG required variables 



     '!!!!!!!!!!!!!!!!!!!!!!!!!!!need to add the processing below to the IF statement aboev so that if the folders exist, the video processing doesn't attempt to run on existing files 
     ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 





     '~~~~~~~~~~~~~~~~~~~~~~~~~~~~START - MOVE THIS DOWN BELOW CREATION OF FILE STRUCTURE WHEN DOEN DEBUGGING************ 


     '***START MOVING the files from the card to the new directory**** 
     For Each foundFile As String In My.Computer.FileSystem.GetFiles(video_card_dir, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "*.MTS") 

      Dim foundFileInfo As New System.IO.FileInfo(foundFile) 
      My.Computer.FileSystem.MoveFile(foundFile, new_video_directory & foundFileInfo.Name) 


     Next 

     For Each foundFile As String In My.Computer.FileSystem.GetFiles(video_card_dir, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "*.MTS") 

      Dim movedFileInfo As New System.IO.FileInfo(foundFile) 
      psi.Arguments = "ffmpeg -i " & movedFileInfo & " -vcodec -c libx264 " & movedFileInfo & ".mp4" 
      psi.ToString() 

      'proc = Process.Start(psi) 

      '***convert each MTS file in the new directory to MP4**** 
      'Writes filenames to merge.txt as " path\to\merge.txt ,    'file ' F:\path\to\    file1 .MP4   '" so that ffmpeg can merge, then rename 
      'My.Computer.FileSystem.WriteAllText(new_video_directory & "merge.txt", "file '" & movedFileInfo & ".mp4'" & vbCrLf, True) 
      '>>>>need to add carriage return to text file 

      'NOW CAPTURE FILENAMES OF MP4 and MERGE INTO 1 MP4 FILE 

      ' merge all F:\path\to\merge.txt to merge the files & merge them 
      'psi.Arguments = "ffmpeg -f concat -i " & new_video_directory & "merge.txt -c copy " & new_filename & ".mp4" 
      proc = Process.Start(psi) 

     Next 

     '***END MERGE FILES*** 


     '~~~~~~~~~~~~~~~~~~~~~~~~~~~~* END - MOVE 


     '***START CREATE STORAGE DIRECTORY STRUCTURE *** 
     'Verify if the build # directory exists? 
     If My.Computer.FileSystem.DirectoryExists(dir & Me.BUILD.Text) Then 
      MessageBox.Show("The build directory exists, moving on to create subdirectories") 
     Else 
      Try 
       'create the new directory    F:\ build \ FLIGHT # 
       My.Computer.FileSystem.CreateDirectory(dir & Me.BUILD.Text) 
       MessageBox.Show("The build directory" & dir & Me.BUILD.Text & " was created.") 
      Catch ex As Exception 
       MessageBox.Show("Doh! The build directory could not be created! Error: " & ex.Message, "Error creating directory.", _ 
           MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 

     End If 

     'verify if the flight num directory exists - or create it 
     If My.Computer.FileSystem.DirectoryExists(new_flightnum_directory) Then 
      MessageBox.Show("The flight # folder already exists! Check that you have the right Flight #.") 
     Else 
      Try 
       'create the new directory    F:\ BUILD \ FLIGHT # 
       My.Computer.FileSystem.CreateDirectory(new_flightnum_directory) 

       'Now create new subDirectories 
       My.Computer.FileSystem.CreateDirectory(new_video_directory) 

       MessageBox.Show("The new flight directory & video CAM subdirectories have been created! The videos will be moved and files converted now which will take some time.") 

      Catch ex As Exception 
       MessageBox.Show("Doh! The flight num or CAM directory could not be created! Error: " & ex.Message, "Error creating directory.", _ 
           MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End If 


     '***END CREATE STORAGE DIRECTORY STRUCTURE *** 





     MessageBox.Show("new merged video file has been created in " & dir & Me.BUILD.Text & "\" & Me.CAM.Text) 

    End Sub 

End Class 
+0

当你说'抱怨我和操作员'时,你会得到什么错误信息? –

+0

未为'String'和'System.IO.FileInfo'类型定义运算符'&'。所以我理解的是我传入的字符串psi.Arguments不喜欢我发送一个字符串和一个变量附加使用'&'操作符的事实...我只是使用逗号或如何将变量movedFileInfo追加到ffmpeg -i? psi的定义如上ProcessStartInfo ...所以我不知道什么类型的VB认识它...我还没有找到ProcessStartInfo启动我的ffmpeg EXE信息。 –

+0

谢谢。您还应该编辑您的问题以包含此信息,以便其他答复者更容易看到。 –

回答

2

的问题是,在操作者&在VB只用来连接System.String对象。它比使用+连接更严格。您不能使用它将StringSystem.IO.FileInfo对象连接在一起。你想要的是从FileInfo对象中获取文件名。它有一个属性FileInfo.FullName,它将返回文件的完整路径,作为String - 从documentation

尝试,而不是:

For Each foundFile As String In My.Computer.FileSystem.GetFiles(video_card_dir, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "*.MTS") 
    Dim movedFileInfo As New System.IO.FileInfo(foundFile) 
    psi.Arguments = "ffmpeg -i " & movedFileInfo.FullName & " -vcodec -c libx264 " & movedFileInfo.FullName & ".mp4" 
    psi.ToString() 
    proc = Process.Start(psi) 
Next 

如果你想与.mp4更换.mts扩展,而不是简单地追加.mp4,因为这不代码,请参阅this question

+0

这可以转换为字符串,然后转换文件到.MTS.MP4,而不是使用movedFileInfo&“.mp4”...有没有另一种选择将最后一部分转换为字符串,但不利用文件类型.MTS? –

+0

谢谢。如果它适合您,请点击答案左侧的勾号将其标记为“已接受”。正如我在我的答案中提到的,更改扩展名(而不是附加到它的mp4)是一个不同的问题,这是回答[这里](http://stackoverflow.com/questions/7356205/remove-file-extension-from-一个字符串对的一档)。我将编辑我的问题以包含链接。 –

+0

完美thx!在此期间,我只是使用了一个temp,然后调用了temp + = 1,因为在这一点上如果我维护文件名并不重要......我的下一个问题是进度条,所以我会在这里搜索下一个。 –