2013-04-10 6 views
8

भीतर मैं एक सी # कार्यक्रम में ffmpeg (Cygwin के साथ Windows पर संकलित) उपयोग करने का प्रयास कर रहा हूँ कहा जाता है नहीं है जब, एक ffmpeg उदाहरण अंडे Process वर्ग का उपयोग करके। हालांकि, मैंने एक अजीब बग मारा है जो ज्यादा समझ में नहीं आता है।ffmpeg रन ठीक से चलाता है, लेकिन से नेट

जब मैं एक खोल से सीधे ffmpeg चलाने के लिए, ffmpeg ठीक से किसी भी मुद्दे के बिना डिकोड और reencode फ़ाइलों सकते हैं (यह Cygwin के bash, PowerShell, cmd हो):

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% 

फ़ाइल ठीक निभाता है, और मैं सांकेतिक शब्दों में बदलना कर सकते हैं मुझे पसंद है डब्ल्यूएवी या किसी अन्य प्रारूप के लिए। हालांकि, जब मैं निम्नलिखित कोड के साथ सी # से ffmpeg फोन:

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(); 

यह बेतरतीब ढंग से त्रुटियों उत्पादन में उत्पन्न होते हैं:

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% 

ध्यान दें कि इन त्रुटियों को हमेशा नहीं होती है। कभी-कभी वे कुछ फाइलों के लिए होते हैं, कभी-कभी वे नहीं करते हैं। मैंने स्ट्रीम रीडायरेक्ट और अस्थायी फ़ाइलों के विभिन्न संयोजनों की कोशिश की है, उनमें से कोई भी काम नहीं करता है। मैंने अस्थायी फ़ाइलों की अखंडता भी सत्यापित की है, और यह सब जांचता है। मैंने इसे हटाए जाने से पहले अस्थायी फ़ाइल को भी निकाला है, और इसे बिना छेड़छाड़ के खोल में डीकोड किया है।

कोई भी विचार?

संपादित करें: मैंने एक शेल स्क्रिप्ट से ffmpeg चलाने का प्रयास किया है जो सी # के माध्यम से चलाया जाता है। यह एक ही मुद्दे देता है। MinGW के माध्यम से ffmpeg संकलन एक ही समस्या देता है।

+0

आप सही * कार्यशील निर्देशिका * स्थापित करने की कोशिश की है? फ़ाइल पथ - जब आप खोल खोल पथ (ज्यादातर आवेदनों निर्देशिका) कार्यशील निर्देशिका के रूप में प्रयोग किया जाता है से एक आवेदन भाग गया, जब आप काम कर निर्देशिका निर्दिष्ट .net से चलाने के अपने .net आवेदन की निर्देशिका –

+0

@Gam Erix है ffmpeg को पास किया गया पूर्ण है, इसलिए मुझे नहीं लगता कि उस अंत में कोई समस्या है। – Bevin

+0

@ बेविन आपने स्टेटिक लिंक्ड लाइब्रेरीज़ के साथ ffmpeg को संकलित करने का प्रयास कैसे किया? शायद यह इस मुद्दे के साथ मदद करेगा। इसके अतिरिक्त, ffmpeg कार्यशील निर्देशिका के अंतर्गत कोडेक (या 'libavcodec') की तलाश कर रहा है। क्या आप कार्यप्रणाली (['Environment.CurrentDirectory'] (http://msdn.microsoft.com/en-us/library/system.environment.currentdirectory.aspx) को सेट करने का प्रयास कर सकते हैं) बस 'proc.Start() से पहले कॉल करें – Jesse

उत्तर

8

यह तर्क है कि आप तर्कों को पारित करने के तरीके के कारण हैं। ऐसा करें:

Process process = new Process(); 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.StartInfo.FileName = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) + 
         @"\bin\ffmpeg.exe"; 

process.StartInfo.Arguments = "-i .\sound1.wav -acodec libvorbis -f ogg abc.ogg"; 


process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = true; 
process.Start(); 

यह सही काम करता है।

+0

मैं ओमिड से सहमत हूं और यदि आप कुछ काम करना चाहते हैं, तो आपको सभी विशेष पात्रों के लिए बचने के चरित्र का उपयोग करना होगा .. – MarmiK

+0

क्या शाब्दिक स्ट्रिंग की आवश्यकता नहीं होनी चाहिए या तर्क निर्दिष्ट करते समय बैकस्लैश से बचें, यानी '। ​​\ Sound1 .wav' त्रुटि होगी। –

संबंधित मुद्दे