2015-12-01 10 views
11

Ho problemi a scrivere video h264 con OpenCV 3 tramite FFmpeg ("'X', '2', '6', '4'" FOURCC). Ho visto tutti i post correlati finora su SO, ma nulla aiuta. Codice:Scrittura x264 da OpenCV 3 con FFmpeg su Linux

cv::VideoWriter writer(output_path.string(), CV_FOURCC('X','2','6','4'), 60, frame_size); 

uscita:

OpenCV: FFMPEG: tag 0x34363258/'X264' non è supportato con id codec 28 e il formato 'mp4/MP4 (MPEG-4 Part 14)' OpenCV : FFMPEG: fallback su utilizza tag 0x00000021/'! ???'

Il video risultante è estremamente piccolo (byte-saggio) e illeggibile. Impostando i risultati da four_cc a -1 in "unknown tag" da FFmpeg, non ho la possibilità di scegliere il codec come suggerito da altri.

I OpenCV 3 stati doc: backend

FFMPEG con contenitore MP4 utilizza nativamente altri valori come fourcc codice: vedi ObjectType, quindi potresti ricevere un messaggio di avviso da OpenCV sulla conversione di codice fourcc.

Quella pagina che refrence non hai h264/x264 elencato, e non sono sicuro come interpretare questa affermazione, dal momento che earlier SO posts sembrano tutta la lista X.2.6.4 come il codice appropriato. Usando H.2.6.4 si ottiene effettivamente un output identico.

Eventuali suggerimenti/soluzioni alternative?

P.S. il ffmpeg è più up-to-date da manutentori di Ubuntu, elenca che è stato configurato con --enable-libx264

EDIT: ho cercato di utilizzare il contenitore mkv invece di mp4. L'avviso sul tag non supportato è andato via, ma il video risultante è ancora illeggibile.

+0

Non so come risolvere questo problema, ma 'VideoWriter' non è molto potente. Probabilmente hai bisogno di salvare il tuo video con qualche formato di lavoro, e poi convertire in H264 con ffmpeg. – Miki

+0

@Miki se conosci un modo per convertire correttamente le matrici opencv in x264_picture_t per usare direttamente x264, potrebbe funzionare. Ho provato a convertire in YUV_I420 e ad impostare manualmente i campi di x264_picture_t, ma fino ad ora non è riuscito. –

risposta

4

Il problema non ha avuto nulla a che fare con l'avviso visualizzato. Stavo cercando di scrivere immagini a canale singolo, mentre VideoWriter si aspettava un'immagine a colori a 3 canali (il valore predefinito di isColor, l'argomento 5-th del costruttore di VideoWriter, è "true"). La soluzione stava impostando isColor su false.

+0

Quando si effettua il downgrade, si prega di prendere in considerazione la possibilità di dare un voto negativo per migliorare la risposta. –

+0

Questa risposta ha un paio di anni, ma sto combattendo con lo stesso problema. Sono su OSX usando OpenCV 3.2.0 e ffmpeg compilato con 'openh264'. Per me impostare il quinto argomento su "Vero" o "Falso" o lasciarlo fuori non fa alcuna differenza. Qualche altra idea su come potrei eseguire il debug di questo? – kramer65

+0

@ kramer65, mi raccomando caldamente di postare un problema separato su questo, e facendo riferimento a questo, dicendo che questo non è il problema che si sta avendo (ad esempio, il flag isColor non fa la differenza). L'unico suggerimento che ho - prova entrambi i codici X264 e H264. Inoltre, su Linux, è necessario installare la libreria di sviluppo libx264, non openh264 ... Non so se c'è un pacchetto di quello per OSX. –

4

Penso che il vostro risultato qui è la chiave:

FFMPEG backend con contenitore MP4 utilizza nativamente altri valori come codice fourcc: vedi ObjectType, quindi potresti ricevere un messaggio di avviso da OpenCV sulla conversione di codice fourcc.

I valori delle variabili mp4 implementate per ffmpeg confermano questo, e sono in ff_mp4_obj_type[], in isom.c. Probabilmente il codice di OpenCV cap_ffmpeg_impl.hpp deve essere aggiornato per supportarlo. Mi misi in giro per un'ora o due, mi resi conto che non era banale e non ero riuscito a salvarlo.

Un modo per aggirare l'output su un file .avi. Ci sono numerosi esempi di persone che hanno problemi con OpenCV e mp4, e viene detto di usare .mov o .avi. (Here's one.

@Greg Kramida: l'impostazione isColor = false non ha aiutato per me: il messaggio è rimasto e il mio file di output è diventato solo ~ 48 byte. Secondo la documentazione è una bandiera di Windows - qualunque cosa stia facendo per me su Linux, non è buona.

Hai confermato che potresti generare x264 con ffmpeg, da solo?

Dopo aver confermato che libx264 ha valore 0x21 quando invoco questo sulla riga di comando:

ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4 

ho deciso di utilizzare 0x21 direttamente in VideoWriter.open(). Ciò genera un file video valido e interpretabile.

Per riferimento, il mio software è FFmpeg 3.0:

ffmpeg -version 
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers 
built with gcc 4.9.2 (Debian 4.9.2-10) 
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame 
libavutil  55. 17.103/55. 17.103 
libavcodec  57. 24.102/57. 24.102 
libavformat 57. 25.100/57. 25.100 
libavdevice 57. 0.101/57. 0.101 
libavfilter  6. 31.100/6. 31.100 
libswscale  4. 0.100/4. 0.100 
libswresample 2. 0.101/2. 0.101 
libpostproc 54. 0.100/54. 0.100 

E OpenCV 3.1.0 configurato con:

cmake \ 
    -D WITH_IPP=ON \ 
    -D INSTALL_CREATE_DISTRIB=ON \ 
    -D CMAKE_BUILD_TYPE=Release \ 
    -D CMAKE_INSTALL_PREFIX=/usr/local .. 

x264 è il rilascio libx264-142:amd64 per Debian Jessie.

+0

Questo è interessante. Sono anche su Linux, e impostare il flag '' 'isColor''' su false ha fatto la differenza per me. Qualunque sia il problema che stai avendo, è ovviamente diverso dal mio, quindi, se sei ancora interessato all'output mp4 diretto da OpenCV, ti suggerisco di inserire una domanda separata che descrive il tuo problema, facendo riferimento a questo. Suggerisco anche di portare questa conversazione in una chat privata per attenersi al formato QA preferito di SO. Posso fornire le mie bandiere di compilazione lì. –

Problemi correlati