7

I have a C# app. I have 100 JPEGs (for an example).

I can easily encode this into a video file.

When it has finished encoding on the client app I FTP upload to my server.

It would be 'neater' if I could not write the video file to a disc but instead write it to a memory stream (or array of bytes) and upload via web service perhaps?

I have checked out the ffmpeg documentation but as a C# developer I do not find it natural to understand the C examples.

I guess my first question is it possible, and if so can anyone post an example code in C#? At the moment I am using the process class in C# to execute ffmpeg.

halfer
  • 19,824
  • 17
  • 99
  • 186
Andrew Simpson
  • 6,883
  • 11
  • 79
  • 179
  • 1
    Note that FFmpeg command line questions go to Super User, while FFmpeg API programming questions belong on Stack Overflow. – slhck Oct 28 '13 at 12:25
  • 1
    possible duplicate of [Can you "stream" images to ffmpeg to construct a video, instead of saving them to disk?](http://stackoverflow.com/questions/13294919/can-you-stream-images-to-ffmpeg-to-construct-a-video-instead-of-saving-them-t) – CodeCaster Oct 28 '13 at 12:26
  • 1
    `ffmpeg` runs as a separate process, you cannot instantiate a stream directly hooking into or coming out of that. You can let `ffmpeg` pipe its output to `stdin` though, see the duplicate link and http://www.codeproject.com/Articles/16011/PipeStream-a-Memory-Efficient-and-Thread-Safe-Stre for example. – CodeCaster Oct 28 '13 at 12:27

1 Answers1

7

Your process method is already good, just needs adjustments:

  1. Set StartupInfo.RedirectStandardOutput = true and StartupInfo.UseShellExecute = false.
  2. Instead of an output file name, call ffmpeg with pipe:, which will make it write to the standard output. Also, since the format cannot be determined from the file name anymore, make sure you use the -f <format> switch as well.
  3. Start the process.
  4. Read from Process.StandardOutput.BaseStream (.BaseStream, so the StreamReader that is .StandardOutput doesn't mess anything up) while the process is running into your memory stream.
  5. Read anything still remaining buffered in Process.StandardOutput.BaseStream.
  6. Profit.

I coded a thumbnailer a while back (BSD 2-clause), that has actual code that demonstrates this. Doesn't matter if it is an image or a video coming out of ffmpeg in the end.

halfer
  • 19,824
  • 17
  • 99
  • 186
nmaier
  • 32,336
  • 5
  • 63
  • 78
  • AN interesting situation cropped up. Have you ever had an occasion were the Process 'hangs' whilst doing this? I just have. If I output it to a file on the hard drive no problem but outputting and capturing the base stream my code hangs... – Andrew Simpson Nov 11 '13 at 13:58
  • 1
    Not really. But is it easy enough to deadlock something by not draining stdout (or stderr, if redirected) or not filling stdin (if redirected). See the remarks section of [`RedirectOutputStream`](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput%28v=vs.110%29.aspx). Without the actual code you're using, it's hard to tell anything. Anyway, you should file a new question. – nmaier Nov 11 '13 at 14:19