2017-06-21 82 views
-5

我正在尝试使用ffmpeg并排合并两个视频。它是工作正常,如果每个视频的大小小于1 MB,如果超过1MB转换过程需要无限的时间。有什么办法可以让它变快或者我需要改变命令行。这里摘录我试图在C#中并排合并两个视频不适用于大文件

ProcessStartInfo proce = new ProcessStartInfo("ffmpeg.exe"); 
     proce.WorkingDirectory = @"d:\vid"; 
     Process p = Process.Start(proce); 
     string wavefilep = @"D:\vid\camVid1.avi"; 
     string videop = @"D:\vid\DeskCamVid1.avi"; 
     string fileout = @"D:\vid\OutPut123.avi"; 
     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     try 
     { 

      proc.StartInfo.Arguments = string.Format(" -i {0} -i {1} -filter_complex \"[0:v:0]pad=iw*4:iw[bg]; [bg][1:v:0] overlay=h\" {2}",wavefilep,videop,fileout); 

      proc.StartInfo.UseShellExecute = false; 
      proc.StartInfo.CreateNoWindow = false; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.FileName = @"d:\vid\ffmpeg.exe"; 
      proc.Start(); 
      string StdOutVideo = proc.StandardOutput.ReadToEnd(); 
      string StdErrVideo = proc.StandardError.ReadToEnd(); 
      MessageBox.Show(" video done"); 

这里被命令使用以合并视频

-i vidoe1.avi -i video2.avi -filter_complex "[0:v:0]pad=iw*2:ih[bg]; [bg][1:v:0]overlay=3*w" output.avi 

这里是FFmpeg的每一次输出日志我运行的应用程序就停留在这个框架

ffmpeg version N-86482-gbc40674 Copyright (c) 2000-2017 the FFmpeg developers 
    built with gcc 7.1.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib 
    libavutil  55. 66.100/55. 66.100 
    libavcodec  57. 99.100/57. 99.100 
    libavformat 57. 73.100/57. 73.100 
    libavdevice 57. 7.100/57. 7.100 
    libavfilter  6. 92.100/6. 92.100 
    libswscale  4. 7.101/4. 7.101 
    libswresample 2. 8.100/2. 8.100 
    libpostproc 54. 6.100/54. 6.100 
Input #0, avi, from 'd:\vid\camVid1.avi': 
    Metadata: 
    encoder   : Lavf57.56.100 
    Duration: 00:01:49.64, start: 0.000000, bitrate: 347 kb/s 
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4/0x34504D46), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 342 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc 
Input #1, avi, from 'd:\vid\DeskCamVid1.avi': 
    Metadata: 
    encoder   : Lavf57.56.100 
    Duration: 00:01:48.80, start: 0.000000, bitrate: 427 kb/s 
    Stream #1:0: Video: mpeg4 (Simple Profile) (FMP4/0x34504D46), yuv420p, 1366x768 [SAR 1:1 DAR 683:384], 422 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc 
File 'd:\vid\outap.avi' already exists. Overwrite ? [y/N] Stream mapping: 
    Stream #0:0 (mpeg4) -> pad 
    Stream #1:0 (mpeg4) -> overlay:overlay 
    overlay -> Stream #0:0 (mpeg4) 
Press [q] to stop, [?] for help 
Output #0, avi, to 'd:\vid\outap.avi': 
    Metadata: 
    ISFT   : Lavf57.73.100 
    Stream #0:0: Video: mpeg4 (FMP4/0x34504D46), yuv420p, 2560x640 [SAR 1:1 DAR 4:1], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default) 
    Metadata: 
     encoder   : Lavc57.99.100 mpeg4 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1 
frame= 28 fps=0.0 q=31.0 size=  325kB time=00:00:03.60 bitrate= 740.3kbits/s speed=7.12x  
frame= 59 fps= 59 q=31.0 size=  416kB time=00:00:07.72 bitrate= 441.8kbits/s speed=7.67x  
frame= 90 fps= 60 q=31.0 size=  536kB time=00:00:11.84 bitrate= 370.8kbits/s speed=7.85x  
frame= 121 fps= 60 q=24.8 size=  661kB time=00:00:15.96 bitrate= 339.5kbits/s speed= 7.9x  
frame= 152 fps= 60 q=31.0 size=  762kB time=00:00:20.08 bitrate= 310.9kbits/s speed=7.96x  
frame= 183 fps= 61 q=31.0 size=  883kB time=00:00:24.20 bitrate= 299.0kbits/s speed= 8x  
frame= 215 fps= 61 q=31.0 size=  974kB time=00:00:28.44 bitrate= 280.6kbits/s speed=8.05x  
frame= 246 fps= 61 q=31.0 size= 1100kB time=00:00:32.56 bitrate= 276.8kbits/s speed=8.05x  
frame= 278 fps= 61 q=31.0 size= 1234kB time=00:00:36.80 bitrate= 274.6kbits/s speed=8.08x  
frame= 310 fps= 61 q=31.0 size= 1327kB time=00:00:41.08 bitrate= 264.6kbits/s speed=8.13x  
frame= 340 fps= 61 q=31.0 size= 1439kB time=00:00:45.04 bitrate= 261.7kbits/s speed=8.11x  
frame= 371 fps= 61 q=31.0 size= 1525kB time=00:00:49.16 bitrate= 254.1kbits/s speed=8.11x  
frame= 403 fps= 61 q=31.0 size= 1639kB time=00:00:53.44 bitrate= 251.2kbits/s speed=8.13x  
frame= 434 fps= 61 q=31.0 size= 1753kB time=00:00:57.56 bitrate= 249.5kbits/s speed=8.14x  
frame= 466 fps= 61 q=31.0 size= 1845kB time=00:01:01.80 bitrate= 244.6kbits/s speed=8.16x  
frame= 497 fps= 61 q=31.0 size= 1958kB time=00:01:05.92 bitrate= 243.3kbits/s speed=8.15x 
+1

你的问题是什么? – rene

+1

尝试正常转换文件(从命令行)。如果它也很慢,除了对ffmpeg代码库作出贡献外,你无能为力。 –

+2

由于您只是在调用命令行工具,因此您应该查看该工具的文档或支持来解决您的问题。这不是一个编程问题,而是工具。 –

回答

0

由于没有人发布的答案我要回答我自己的问题。 ffmpeg命令没有问题,但是调用ffmpeg.exe的进程代码有点改变,解决了我的问题。

string wavefilep = @"D:\vid\camVid1.avi"; 
    string videop = @"D:\vid\DeskCamVid1.avi"; 
    string fileout = @"D:\vid\OutPut123.avi"; 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    try 
    { 

     proc.StartInfo.Arguments = string.Format(" -i {0} -i {1} -filter_complex \"[0:v:0]pad=iw*4:iw[bg]; [bg][1:v:0] overlay=h\" {2}",wavefilep,videop,fileout); 

     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.CreateNoWindow = true; 
     proc.StartInfo.FileName = @"d:\vid\ffmpeg.exe"; 
     proc.StartInfo.WindowsStyle=ProcessWindowStyle.Hidden; 
     proc.Start(); 
     MessageBox.Show(" video done"); 

我设置RedirectStandardOutput & RedirectStandardError工艺的真正拿到的ffmpeg的输出和输出日志,这会导致对大型视频文件的冻结问题,因为它需要无限的时间来读取输出。我认为如果我们使用ffmpeg,就不需要这两条语句。

相关问题