I am trying to use ffmpeg (compiled on Windows with Cygwin) in a C # program using the Process class to instantiate ffmpeg. However, I got into a rather strange error that doesn't make much sense.
When I run ffmpeg directly from the shell (be it Cygwin bash, PowerShell, cmd), ffmpeg can correctly decode and transcode files without any problems:
PS C:\audio> ffmpeg -i .\sound1.wav -acodec libvorbis -f ogg abc.ogg ffmpeg version 1.2 Copyright (c) 2000-2013 the FFmpeg developers built on Apr 8 2013 15:10:40 with gcc 4.5.3 (GCC) configuration: --disable-encoder=vorbis --enable-libvorbis libavutil 52. 18.100 / 52. 18.100 libavcodec 54. 92.100 / 54. 92.100 libavformat 54. 63.104 / 54. 63.104 libavdevice 54. 3.103 / 54. 3.103 libavfilter 3. 42.103 / 3. 42.103 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 [wav @ 0x800538a0] max_analyze_duration 5000000 reached at 5015510 microseconds Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from '.\sound1.wav': Metadata: encoder : Lavf54.63.104 Duration: 00:00:05.76, bitrate: 1411 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s Output #0, ogg, to 'abc.ogg': Metadata: encoder : Lavf54.63.104 Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp Stream mapping: Stream #0:0 -> #0:0 (pcm_s16le -> libvorbis) Press [q] to stop, [?] for help size= 55kB time=00:00:05.74 bitrate= 78.5kbits/s video:0kB audio:51kB subtitle:0 global headers:4kB muxing overhead 0.817473%
The file plays perfectly and I can encode WAV or any other format that I like. However, when I call ffmpeg from C # with the following code:
string tempfile = Path.GetTempFileName(); FileStream tempfilestr = File.OpenWrite(tempfile); input.CopyTo(tempfilestr); ProcessStartInfo pstart = new ProcessStartInfo("ffmpeg", string.Format("-i \"{0}\" -v verbose -y -f wav -", tempfile)); pstart.CreateNoWindow = true; pstart.ErrorDialog = false; pstart.RedirectStandardOutput = true; pstart.RedirectStandardError = true; pstart.UseShellExecute = false; Process proc = new Process(); proc.StartInfo = pstart; proc.Start(); StreamReader stdout = proc.StandardOutput; StreamReader stderr = proc.StandardError; outtempfilestr = File.OpenRead(outtempfile); MemoryStream output = new MemoryStream(); stdout.BaseStream.CopyTo(output); try { proc.Kill(); } catch(InvalidOperationException) { } catch(Win32Exception) { } File.Delete(tempfile); return output.ToArray();
This randomly produces errors in the output:
ffmpeg version 1.2 Copyright (c) 2000-2013 the FFmpeg developers built on Apr 8 2013 15:10:40 with gcc 4.5.3 (GCC) configuration: --disable-encoder=vorbis --enable-libvorbis libavutil 52. 18.100 / 52. 18.100 libavcodec 54. 92.100 / 54. 92.100 libavformat 54. 63.104 / 54. 63.104 libavdevice 54. 3.103 / 54. 3.103 libavfilter 3. 42.103 / 3. 42.103 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 [wav @ 0x80053860] parser not found for codec pcm_s16le, packets or times may be invalid. Last message repeated 1 times [wav @ 0x80053860] max_analyze_duration 5000000 reached at 5015510 microseconds Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, wav, from 'C:\Users\Bevin\AppData\Local\Temp\tmp1CCE.tmp': Duration: 00:00:05.20, bitrate: 1411 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s [graph 0 input from stream 0:0 @ 0x8011f320] tb:1/44100 samplefmt:s16 samplerate:44100 chlayout:0x3 Output #0, wav, to 'pipe:': Metadata: ISFT : Lavf54.63.104 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_s16le -> pcm_s16le) Press [q] to stop, [?] for help Multiple frames in a packet from stream 0 [pcm_s16le @ 0x8005c160] Invalid PCM packet, data has size 3 but at least a size of 4 was expected Error while decoding stream #0:0: Invalid data found when processing input No more output streams to write to, finishing. size= 896kB time=00:00:05.20 bitrate=1411.3kbits/s video:0kB audio:896kB subtitle:0 global headers:0kB muxing overhead 0.008719%
Please note that these errors do not always occur. Sometimes they happen for certain files, sometimes they do not. I tried various combinations of stream redirects and temporary files, none of them work. I also checked the integrity of temporary files, and all of this is checked. I even extracted the temporary file before deleting it and decoded it in the shell without crashing.
Any ideas?
Edit: I tried to run ffmpeg from a shell script that runs through C #. This gives the same problems. Compiling ffmpeg via MinGW gives the same problem.