Estrazione fotogrammi con avconv

Se si vuole estrarre fotogrammi ad un rate inferiore a quello del video si ottiene sempre un errore
[mjpeg @ 0x9a18480] Error, Invalid timestamp=0, last=0

Mettendo il parametro -vsync 1 non si presenta più.

Esempio:

avconv -i myvideo.MP4 -vsync 1 -r 0.2 -an -y 'frame%04d.jpg'

Modifica del framerate con avconv (ffmpeg)

I filmati della GoPro sono in MP4 con audio AAC.
Non è possibile modificare direttamente il framerate : bisogna prima decomprimere il video in un formato grezzo (RAW), elaborarlo, e ricomprimerlo come si vuole.
Ma quando si lavora con il formato RAW, bisogna anche inserire manualmente i parametri del video, altrimenti avconv restituisce degli errori come:

[IMGUTILS @ 0xbfd9a704] Picture size 0x0 is invalid
[rawvideo @ 0x8e95ec0] Could not find codec parameters (Video: rawvideo, yuv420p)
[rawvideo @ 0x8e95ec0] Estimating duration from bitrate, this may be inaccurate
pipe:: could not find codec parameters

Quindi bisogna inserire nella riga di comando almeno i parametri –pix_fmt, -vcodec, -s.
Per leggere i valori da inserire, si lancia avconv senza un output:

$ avconv -i video.mp4
[...]
Stream #0.0(eng): Video: h264 (High), yuvj420p, 1280x720
[...]

Quindi costruisco il comando che decomprime il video leggendo i valori restituiti:
(non usare questo esempio: potrebbe uscire un file enorme !)

avconv -i video.mp4 -f rawvideo -pix_fmt yuv420p -vcodec rawvideo -s 1280x720 -y output.tmp

Ora è possibile elaborare il video:

# notare il parametro -r prima del file di input: serve a leggere
# il file di input ad una velocità diversa da quella di default.
avconv -r 10 -f rawvideo -pix_fmt yuv420p -s 1280x720 -i output.tmp -y output.mp4
# se necessario, è possibile specificare un framerate anche per l' output:
avconv -r 10 -f rawvideo -pix_fmt yuv420p -s 1280x720 -i output.tmp -r 30 -y output.mp4

Invece di fare le 2 operazioni di decodifica e ricodifica separatamente, è preferibile usare una pipe.
Quindi riprendo i 2 comandi appena visti e li unisco, usando però lo stdout per scrivere e lo stdin per leggere il video RAW:

avconv -i video.mp4 -f rawvideo -pix_fmt yuv420p -vcodec rawvideo -s 1280x720 pipe:1 | \
avconv -r 10 -f rawvideo -pix_fmt yuv420p -s 1280x720 -i pipe:0 -y output.mp4
# è possibile anche non specificare il file descriptor delle pipe:
# avconv riesce da solo a prendere la pipe giusta
avconv -i video.mp4 -f rawvideo -pix_fmt yuv420p -vcodec rawvideo -s 1280x720 pipe: | \
avconv -r 10 -f rawvideo -pix_fmt yuv420p -s 1280x720 -i pipe: -y output.mp4