AVCONV e pipe

per convertire un file audio/video con avconv basta scrivere una riga come questa:
avconv -i input.mpg output.mp4

però se si vuole usare un encoder “personalizzato” è possibile inviare l’ output non compresso tramite una pipe. ad esempio:
avconv -i input.m4a -f s32be -af atrim=10:45 pipe: | lame -r --big-endian --bitwidth 32 -ms -q0 --vbr-new -V3 - test.mp3
in cui si può notare che il flusso decompresso nel formato raw PCM signed a 32 bit big-endian viene trimmato tra i 10 e i 45 secondi e poi inviato alla pipe.

lame poi deve essere istruito riguardo al flusso che riceve dallo STDIN (indicato dal carattere “-” come input): si indica “-r –big-endian –bitwidth 32 -ms” per segnalare il formato del flusso raw (32 bit big endian e modalità stereo; signed è di default).

dopodichè viene compresso alla massima qualità e VBR 3.

in modo simile si può operare per i video: decomprimere, trattare il flusso (ad esempio trim o concat) ed inviarlo alla pipe.
riceverlo in stdin indicando tutti i parametri del flusso.

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