Video does not play when creating video from images and adding audio

So, I have a bunch of images in a folder with the following structure:

image-0.png
image-1.png
image-2.png

      

Sometimes a folder can only have one image, which will be saved as:

image-0.png

      

My code for generating video and adding audio

// create the file
using (WaveFileReader wf = new WaveFileReader(Audio))
{
    // the files
    OldVideo = "old.avi";
    NewVideo = "video.avi";
    Audio = "sound.wav";

    // Get the time of the audio and divide by images
    time = wf.TotalTime.TotalSeconds;
    mimtime = time / imagescount;

    ffmpegPath = "ffmpeg.exe";
    ffmpegParams = " -r 1/" + mimtime + " -i " + ImagesFolder + "image-%d.png -t " + time + " -y -vf scale=1280:-2 " + OldVideo;
    ffmaudioParams = " -i " + OldVideo + " -i " + Audio + " -c copy -shortest " + NewVideo;
}


using (Process ffmpeg = new Process())
{
    //Generate video
    ffmpegstartInfo = new ProcessStartInfo();
    ffmpegstartInfo.FileName = ffmpegPath;
    ffmpegstartInfo.Arguments = ffmpegParams;
    ffmpegstartInfo.RedirectStandardOutput = true;
    ffmpegstartInfo.RedirectStandardError = true;
    ffmpegstartInfo.UseShellExecute = false;
    ffmpegstartInfo.CreateNoWindow = true;

    ffmpeg.StartInfo.FileName = ffmpegPath;
    ffmpeg.StartInfo.Arguments = ffmpegParams;
    ffmpeg.StartInfo = ffmpegstartInfo;
    ffmpeg.Start();
    ffmpeg.WaitForExit(30000);


    /*ffmpeg.StartInfo.FileName = "cmd.exe";
    ffmpeg.StartInfo.Arguments = "/k " + ffmpegPath + " " + ffmpegParams;
    ffmpeg.Start();
    ffmpeg.WaitForExit(30000);*/
}

using (Process ffmaudio = new Process())
{
    //Add audio to video
    ffmaudiostartInfo = new ProcessStartInfo();
    ffmaudiostartInfo.FileName = ffmpegPath;
    ffmaudiostartInfo.Arguments = ffmaudioParams;
    ffmaudiostartInfo.RedirectStandardOutput = true;
    ffmaudiostartInfo.RedirectStandardError = true;
    ffmaudiostartInfo.UseShellExecute = false;
    ffmaudiostartInfo.CreateNoWindow = true;

    ffmaudio.StartInfo.FileName = ffmpegPath;
    ffmaudio.StartInfo.Arguments = ffmaudioParams;
    ffmaudio.StartInfo = ffmaudiostartInfo;
    ffmaudio.Start();
    ffmaudio.WaitForExit(30000);

    /*ffmaudio.StartInfo.FileName = "cmd.exe";
    ffmaudio.StartInfo.Arguments = "/k " + ffmpegPath + " " + ffmaudioParams;
    ffmaudio.Start();
    ffmaudio.WaitForExit(30000);*/
}

      

So what my code does is, with wavfilereader

it gets the total length of my audio file and then splits that time by the number of images I have, so I can generate a video with split images, Then I generate the video into a file named "old.avi "which is then used with my wav file to create a new file called video.avi (which I am trying to create along with the generated video and audio)

My problem is when I create a video, it becomes available. It claims to have been (for example) 1 minute 50 seconds, but once I click on it, it won't play. It just becomes unplayable as you can see below

http://i.imgur.com/tsck2NX.gifv

I am using C # with process and Winforms which opens a cmd line to run ffmpeg with the two commands named above with the variables below:

ffmpegParams;
ffmaudioParams;

      

Who has all the commands i use

-r 1/ (audio length /divided by total images) so they're equal
-t (to limit to the total time which is the audio total seconds)
... I am using more as you can see in my code above

      

How can I fix my problem that I have described?

CMD line when creating video:

ffmpeg version N-86848-g03a9e6f 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. 68.100 / 55. 68.100
  libavcodec     57.102.100 / 57.102.100
  libavformat    57. 76.100 / 57. 76.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 95.100 /  6. 95.100
  libswscale      4.  7.101 /  4.  7.101
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100
Input #0, image2, from 'C:\Users\Laptop\Documents\program/images/image-%d.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgba(pc), 800x800, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
[mpeg4 @ 00000000024f44a0] bitrate tolerance 4000000 too small for bitrate 200000, overriding
Output #0, avi, to 'C:\Users\Laptop\Documents\program/old.avi':
  Metadata:
    ISFT            : Lavf57.76.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x1280, q=2-31, 200 kb/s, 0.01 fps, 0.01 tbn, 0.01 tbc
    Metadata:
      encoder         : Lavc57.102.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame=    1 fps=0.0 q=6.8 Lsize=      46kB time=00:01:37.57 bitrate=   3.9kbits/s speed=1.43e+003x
video:41kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 13.641467%

      

When adding audio to video

ffmpeg version N-86848-g03a9e6f 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. 68.100 / 55. 68.100
  libavcodec     57.102.100 / 57.102.100
  libavformat    57. 76.100 / 57. 76.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 95.100 /  6. 95.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 'C:\Users\Laptop\Documents\program/old.avi':
  Metadata:
    encoder         : Lavf57.76.100
  Duration: 00:01:37.58, start: 0.000000, bitrate: 3 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 1280x1280 [SAR 1:1 DAR 1:1], 0.01 fps, 0.01 tbr, 0.01 tbn, 40 tbc
Guessed Channel Layout for Input Stream #1.0 : mono
Input #1, wav, from 'C:\Users\Laptop\Documents\program/audio.wav':
  Duration: 00:01:37.57, bitrate: 352 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 22050 Hz, mono, s16, 352 kb/s
Output #0, avi, to 'C:\Users\Laptop\Documents\program/video.avi':
  Metadata:
    ISFT            : Lavf57.76.100
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 1280x1280 [SAR 1:1 DAR 1:1], q=2-31, 0.01 fps, 0.01 tbr, 0.01 tbn, 0.01 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 22050 Hz, mono, s16, 352 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    1 fps=0.0 q=-1.0 Lsize=      55kB time=00:01:37.57 bitrate=   4.6kbits/s speed=1.95e+005x
video:41kB audio:4kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 21.946869%

      

+3


source to share


1 answer


A few things:

1) check your calculations. Your output displays

frame=    1 fps=0.0 q=-1.0 Lsize=      55kB time=00:01:37.57

      

At 0.01 frames per second, the image will switch after 100 seconds. Since your output is 97 seconds, there is exactly 1 frame and therefore only 1 image is output. Although your input also only shows one image input:



Input #0, image2, from 'C:\Users\Laptop\Documents\program/images/image-%d.png':
Duration: 00:00:00.04, start: 0.000000, bitrate: N/A 

      

(Use -framerate

instead -r

)

2) VLC and some other players don't like low frame rates. Add -r 6

after filter scale. This should provide you with the duration display in VLC.

+2


source







All Articles