I'm using this command for ffmpeg:
ffmpeg -i 1.h264 -i ass1.ass -map 0 -map 1 -c copy test.mkv
The h264 file is 30 fps... the mkv plays at 25fps so it runs slow
The h264 come off my hd webcam. If i change the frame rate on the camera to 25 it works fine and 15fps wilk play at high speed. I can force the frame rate? Every if i need a different command line tool to change it that is acceptable. But if i could fix it form ffmpeg that would be ideal. I'm running the commands from vb.net.
command output
C:\Record\Normal\2013-06-27>c:\ffmpeg\bin\ffmpeg -i 1.h264 -i ass1.ass -map 0 -
map 1 -c copy test.mkv
ffmpeg version N-54207-ge59fb3f Copyright (c) 2000-2013 the FFmpeg developers
built on Jun 25 2013 21:55:00 with gcc 4.7.3 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-
amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --
enable-libxvid --enable-zlib
libavutil 52. 37.101 / 52. 37.101
libavcodec 55. 17.100 / 55. 17.100
libavformat 55. 10.100 / 55. 10.100
libavdevice 55. 2.100 / 55. 2.100
libavfilter 3. 77.101 / 3. 77.101
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, h264, from '1.h264':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (Baseline), yuv420p, 1920x1088 [SAR 1:1 DAR 30:17],
25 fps, 25 tbr, 1200k tbn, 50 tbc
Input #1, ass, from 'ass1.ass':
Duration: N/A, bitrate: N/A
Stream #1:0: Subtitle: ssa
File 'test.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'test.mkv':
Metadata:
encoder : Lavf55.10.100
Stream #0:0: Video: h264 (H264 / 0x34363248), yuv420p, 1920x1088 [SAR 1:1 DA
R 30:17], q=2-31, 25 fps, 1k tbn, 1200k tbc
Stream #0:1: Subtitle: ssa
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 144 fps=0.0 q=-1.0 Lsize= 2451kB time=00:00:05.72 bitrate=3509.6kbits
/s
video:2447kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.125529%
Eg. To force the frame rate of the output file to 24 fps (-r):
ffmpeg -i input.avi -r 24 output.avi
Related
Please help with the error, trying to re-encode the source file produced with prores 4444+alpha. Alpha channel is required in my case.
I've tried two separate options, both are erroring out:
$ ffmpeg -i Input.mxf -vcodec prores_ks -profile:v 4 -y Output.mxf
I'm getting this output
ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 12.0.5 (clang-1205.0.22.9)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mxf, from 'Input.mxf':
Metadata:
operational_pattern_ul: 060e2b34.04010101.0d010201.01010100
uid : b52947e8-d982-11ec-9a2d-b42e99ab5f4d
generation_uid : b52947e9-d982-11ec-a612-b42e99ab5f4d
company_name : Adobe Inc.
product_name : Premiere Pro
product_version_num: 2.0.0.0.1
product_version : 22.4.0
application_platform: Mac OS X
product_uid : 0c3919fe-46e8-11e5-a151-feff819cdc9f
toolkit_version_num: 5.3.6.0.1
modification_date: 2022-05-22T03:53:15.000000Z
material_package_umid: 0x060A2B340101010501010D1113000000F88BD5002197058861C9B42E99AB5F4D
timecode : 00:00:00;00
Duration: 00:00:59.66, start: 0.000000, bitrate: 32803 kb/s
Stream #0:0: Video: prores (4444) (ap4h / 0x68347061), yuva444p12le(tv, bt709, progressive), 1920x1080, SAR 1:1 DAR 16:9, 29.97 tbr, 29.97 tbn, 29.97 tbc
Metadata:
file_package_umid: 0x060A2B34010101050101051213D028BEF88BD500219705880089B42E99AB5F4D
file_package_name: Source Package
track_name : Track 1
Stream mapping:
Stream #0:0 -> #0:0 (prores (native) -> prores (prores_ks))
Press [q] to stop, [?] for help
Output #0, mxf, to 'Output.mxf':
Metadata:
operational_pattern_ul: 060e2b34.04010101.0d010201.01010100
uid : b52947e8-d982-11ec-9a2d-b42e99ab5f4d
generation_uid : b52947e9-d982-11ec-a612-b42e99ab5f4d
timecode : 00:00:00;00
material_package_umid: 0x060A2B340101010501010D1113000000F88BD5002197058861C9B42E99AB5F4D
product_version_num: 2.0.0.0.1
modification_date: 2022-05-22T03:53:15.000000Z
application_platform: Mac OS X
product_uid : 0c3919fe-46e8-11e5-a151-feff819cdc9f
toolkit_version_num: 5.3.6.0.1
encoder : Lavf58.76.100
Stream #0:0: Video: prores (ap4h / 0x68347061), yuva444p10le(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn
Metadata:
file_package_umid: 0x060A2B34010101050101051213D028BEF88BD500219705880089B42E99AB5F4D
file_package_name: Source Package
track_name : Track 1
encoder : Lavc58.134.100 prores_ks
[mxf # 0x7fbbbc008200] could not get prores profile0:00.00 bitrate=N/A speed= 0x
av_interleaved_write_frame(): Operation not permitted
Error writing trailer of Output.mxf: Unknown error occurred
frame= 33 fps= 27 q=-0.0 Lsize= 0kB time=00:00:00.03 bitrate= 0.0kbits/s speed=0.027x
video:67kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!
Above I can't even fully see the error since the red text over black background covers the screen:
I have also tried the following encoding options:
-c:v qtrle -pix_fmt argb
to which, I'm getting the following error:
track 0: could not find essence container ul, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted
Error initializing output stream 0:0 --
Conversion failed!
In case this is helpful, I'm displaying MediaInfo for the source file:
Don't use mxf wrapper, I've had this issue before, what helped is to process the output as MOV. This solved my issue and this is how I request agency to send me their output, if alpha is needed:
Preset: custom
Format: QuickTime
Video Codec: Animation
then, under basic video settings:
expend more
Depth, and choose 8-bpc+alpha
I'm trying to capture a screenshot from a udp stream using ffmpeg in a Ubuntu 14.04 System.
Following is the command
ffmpeg -y -i udp_ip -vframes 1 -q:v 1 test.png
But the image captured is of very poor resolution and I observed a lag while taking the screenshot.
Please suggest a best tool or a way to take a screenshot in the fastest way and also of the best image resolution possible.
edit:
log files
ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --mandir=/usr/share/man --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libfreetype --enable-gnutls --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libtheora --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvidstab --enable-libwavpack --enable-nvenc
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libavresample 3. 5. 0 / 3. 5. 0
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
[mpeg2video # 0x390cc60] Invalid frame dimensions 0x0.
Last message repeated 7 times
Input #0, mpegts, from 'udp://#xxx.xx.xx.xx:xxxx':
Duration: N/A, start: 144.130744, bitrate: 4128 kb/s
Program 1
Metadata:
service_name : Program-1
service_provider: Encoder
Stream #0:0[0x42]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 720x576 [SAR 16:15 DAR 4:3], 4000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x43]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> png (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'player.png':
Metadata:
encoder : Lavf57.71.100
Stream #0:0: Video: png, rgb24, 720x576 [SAR 16:15 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc57.89.100 png
frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A dup=1 drop=1 speed=0.729x
video:777kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Since, this seems to be an issue of aspect ratio, and not quality, per se, use
ffmpeg -y -i udp_ip -vf scale=iw*sar:ih,setsar=1 -vframes 1 -q:v 1 test.png
The scale filter rescales the video to square pixels. The SAR filter isn't strictly necessary but in case the PNG muxer writes that data, better to reset it.
I tried to just copy (a period of time of) an AVI-Video into another newly created AVI-file using ffmpeg's copy option.
(On Windows 32-bit)
ffmpeg -i "C:\Temp\zzz\myAvi.avi" -c copy -t 00:00:10 "C:\Temp\zzz\myAviNew.avi"
Why are the pictures flipped upside-down in the resulting file ?
(Also the generated new audio is a little distorted.)
Using the same command again on the newly created file will not flip them back again - the pictures stay upside down.
Why this? Is it a bug?
Console brings the following output:
ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
built on Mar 13 2013 21:26:48 with gcc 4.7.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libo
pencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-li
bschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-lib
twolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enabl
e-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 52. 19.100 / 52. 19.100
libavcodec 55. 0.100 / 55. 0.100
libavformat 55. 0.100 / 55. 0.100
libavdevice 54. 4.100 / 54. 4.100
libavfilter 3. 45.103 / 3. 45.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[avi # 02537ba0] non-interleaved AVI
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, avi, from 'C:\Temp\zzz\Hase.avi':
Duration: 00:00:35.92, start: 0.000000, bitrate: 171375 kb/s
Stream #0:0: Video: rawvideo, bgra, 768x576, 12 tbr, 12 tbn, 12 tbc
Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16
, 1411 kb/s
Output #0, avi, to 'C:\Temp\zzz\HaseNew.avi':
Metadata:
ISFT : Lavf55.0.100
Stream #0:0: Video: rawvideo, bgra, 768x576, q=2-31, 12 tbn, 12 tbc
Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, 141
1 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 11 fps=0.0 q=-1.0 size= 19162kB time=00:00:00.91 bitrate=171242.4kbit
frame= 16 fps= 12 q=-1.0 size= 27874kB time=00:00:01.33 bitrate=171255.5kbit
...
...
...
frame= 120 fps=5.4 q=-1.0 size= 209083kB time=00:00:09.99 bitrate=171280.6kbit
frame= 121 fps=5.5 q=-1.0 Lsize= 210834kB time=00:00:10.08 bitrate=171288.2kbi
ts/s
video:209088kB audio:1723kB subtitle:0 global headers:0kB muxing overhead 0.0112
76%
C:\WINDOWS\system32>
The issue might come from your input file. The copy does exactly what it says, it copies the bitstream from your input container to an output container. When an issue arise, most of the time it is because some data has not been passed from the input to the output, (such as metadata) since video data can't be modified using copy.
Regarding your specific issue, video files can contain metadata to specify the rotation to which be played to the video player.
To add that information back to the output container, you need to add the following attribute to the ouput.
-metadata:s:v:0 rotate=180
Your initial command should look like :
ffmpeg -i "C:\Temp\zzz\myAvi.avi" -c copy -t 00:00:10 -metadata:s:v:0 rotate=180 "C:\Temp\zzz\myAviNew.avi"
I'm trying to use ffmpeg to cut out part of an avi file.
I know similar questions have been asked before, but i've trawled through loads of other posts and I can't see where I'm going wrong.
The command line args i'm using to test on a 7 second video is:
-ss 00:00:01 -t 00:00:01 -i "C:\recordings\2013-09-11\Camera 1\Camera 1_2013-09-11_22-23-43.avi" -vcodec copy -acodec copy "I:\clip2.avi"
The output is:
ffmpeg version N-56254-gb7bd688 Copyright (c) 2000-2013 the FFmpeg developers built on Sep 12 2013 21:00:14 with gcc 4.7.3 (GCC) configuration:
--enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 52. 43.100 / 52. 43.100
libavcodec 55. 31.101 / 55. 31.101
libavformat 55. 16.102 / 55. 16.102
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 84.100 / 3. 84.100
libswscale 2. 5.100 / 2. 5.100
libswresample 0. 17.103 / 0. 17.103
libpostproc 52. 3.100 / 52. 3.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, avi, from 'C:\recordings\2013-09-11\Camera 1\Camera 1_2013-09-11_22-23-43.avi':
Duration: 00:00:07.03, start: 0.000000, bitrate: 787 kb/s
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 800x448, 30 fps, 30 tbr, 30 tbn, 30 tbc
Stream #0:1: Audio: adpcm_ms ([2][0][0][0] / 0x0002), 44100 Hz, mono, s16, 176 kb/s
Output #0, avi, to 'I:\clip2.avi':
Metadata:
ISFT : Lavf55.16.102
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 800x448, q=2-31, 30 fps, 30 tbn, 30 tbc
Stream #0:1: Audio: adpcm_ms ([2][0][0][0] / 0x0002), 44100 Hz, mono, 176 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 88 fps=0.0 q=-1.0 Lsize= 226kB time=00:00:02.03 bitrate= 908.7kbits/s
video:146kB audio:66kB subtitle:0 global headers:0kB muxing overhead 6.345259%
I end up with a clip which is 3 seconds long !!!??
In the output I can see that the -ss flag is completely ignored.
Can anyone see where I'm going wrong?
Thanks
Some tips here: https://trac.ffmpeg.org/wiki/Seeking%20with%20FFmpeg
See "Fast Seeking" vs "Accurate Seeking". For accurate seeking:
-ss must come AFTER -i
I suspect your input frames fall outside any keyframes so "Fast Seeking" (-ss before -i) fails.
Also -t normally takes as its input a number of frames, I'm not sure if it accepts a timecode. Consider using -t 1 instead or -to 00:00:02 instead (note: -to, not -t).
EDIT: slhck is right regarding -t versus -vframes, see comment.
-i is for duration.
for example if you want 5 seconds video, Should write
-ss 00:00:01 -t 00:00:05 -i "C:\recordings\2013-09-11\Camera 1\Camera 1_2013-09-11_22-23-43.avi" -vcodec copy -acodec copy "I:\clip2.avi"
-ss is the offset when you write -ss 00:00:01 that Leaves to you 6 seconds
when write -t 00:00:01 that's make a video with 1 second not 3 seconds.
Just don't use codec copy command. delete "-vcodec copy -acodec copy" and try you are will get exact copy times
The question is simple: I don't want ffmpeg to create an animated GIF from given video stream, I want separate frames, each in GIF format. But when I set output file to something like frame%09d.gif ffmpeg tends to create an animation (and stores it exactly as frame%09d.gif). The same for -f gif option.
Of course, I could save PNGs and use ImageMagic's convert utility to transform them to GIFs, but I don't want any additional invocation overhead because I'm dealing with live streams and going to crunch large amounts of data.
Here is what I do, nothing special:
ffmpeg -i http://brightcove03-f.akamaihd.net/valgbodmandag1378107345_1_300k#80362 -f gif -y frame_%09d.gif
ffmpeg version N-54643-g15cee5e Copyright (c) 2000-2013 the FFmpeg developers
built on Jul 11 2013 03:35:11 with gcc 4.7.3 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --ena
ble-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger -
-enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-lib
vpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 52. 39.100 / 52. 39.100
libavcodec 55. 18.102 / 55. 18.102
libavformat 55. 12.101 / 55. 12.101
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 80.100 / 3. 80.100
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
[flv # 00000000002cb700] Stream discovered after head already parsed
Input #0, flv, from 'http://brightcove03-f.akamaihd.net/valgbodmandag1378107345_1_300k#80362':
Metadata:
encoder : Lavf54.6.100
Duration: 00:00:00.00, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 25 tbr, 1k tbn, 50 tbc
Stream #0:1: Audio: aac, 44100 Hz, stereo, fltp, 128 kb/s
Stream #0:2: Data: none
[swscaler # 0000000004d051e0] No accelerated colorspace conversion found from yuv420p to bgr8.
Output #0, gif, to 'frame_%09d.gif':
Metadata:
encoder : Lavf55.12.101
Stream #0:0: Video: gif, bgr8, 480x270 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 100 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> gif)
Press [q] to stop, [?] for help
frame= 141 fps=130 q=-1.0 Lsize= 4960kB time=00:00:05.68 bitrate=7153.1kbits/s
video:5100kB audio:0kB subtitle:0 global headers:0kB muxing overhead -2.743247%
After all I get a file named "frame_%03d.gif", but instead I want to have several files "frame_001.gif", "frame_002.gif", etc.
Any ideas?
Thanks in advance.
When you use -f gif, you're forcing ffmpeg to use the GIF muxer, which writes the converted video stream into a single animated GIF file.
With recent ffmpeg:
Use this to force ffmpeg to mux every frame as a GIF to a separate file:
ffmpeg -i input -c:v gif -f image2 out%04d.gif
With ffmpeg 1.2.1 and lower:
When you leave out -f gif, ffmpeg correctly produces single images for each frame:
ffmpeg -i input output%04d.gif
If you're stuck on a version where you still have this bug (i.e. probably 2.0 and 2.1), ffmpeg doesn't follow the above syntax. Your only option here is to create PNG images instead:
ffmpeg -i input output%04d.png
And use ImageMagick to convert them:
for f in output*.png; do convert "$f" "${f%.png}.gif"; done