PDA

View Full Version : [C++ o Dos] Unire File Video


skeleton
14-07-2012, 18:59
Buona sera,

sto scrivendo un programma in c++ e sono arrivato al un punto in cui ho bisogno di unire più file video in uno. I file, inoltre, sono molteplici e con nomi imprevedibili e il programma verrà eseguito nella stessa cartella dei video.

Ho provato ad usare questo codice dos, validissimo per quasi tutti i tipi file (tranne l'avi, evidentemente -.-), che ho inserito nel solito system("...."):
copy /b *.avi ciao.no
Poi rinomino ciao.no per trasformarlo in ciao.avi.

Il codice in sè funziona, ma ogni file video nel suo codice interno penso espliciti anche la lunghezza, così quando apro ciao.avi mi riproduce solo il primo video, nonostante le sue dimensioni totali siano la somma esatta di tutti gli avi.
Come potrei risolvere?

Grazie mille in anticipo :)

AnonimoVeneziano
15-07-2012, 13:50
Un file AVI è un file con una struttura specifica, non puoi semplicemente concatenare i due file insieme , ma devi unirli rispettando la struttura del file.

Ti consiglio di leggerti un po' di documentazione su come un file AVI è strutturato e scrivere del codice che unisce i due file in maniera corretta:

http://msdn.microsoft.com/en-us/library/ms779636.aspx

Oppure, se puoi fare affidamento a un tool esterno. Potresti cercare di vedere se in giro ci sono dei tool a linea di comando che fanno il lavoro che vuoi senza dover scrivere tu l'unificatore.

Ciao

skeleton
15-07-2012, 17:17
Un file AVI è un file con una struttura specifica, non puoi semplicemente concatenare i due file insieme , ma devi unirli rispettando la struttura del file.

Ti consiglio di leggerti un po' di documentazione su come un file AVI è strutturato e scrivere del codice che unisce i due file in maniera corretta:

http://msdn.microsoft.com/en-us/library/ms779636.aspx

Oppure, se puoi fare affidamento a un tool esterno. Potresti cercare di vedere se in giro ci sono dei tool a linea di comando che fanno il lavoro che vuoi senza dover scrivere tu l'unificatore.

Ciao

Scusa la domanda, ma se mi trovassi davanti a file mpg o wma cambierebbe qualcosa? Sarei in grado di unirli senza problemi? E cortesemente mi spiegheresti le eventuali differenze tra i tre formati? :) Perchè mi rendo conto solo ora che i file originalmente possono essere anche di questi formati...

Comunque grazie per l'aiuto, leggerò la documentazione da te fornita :)

VICIUS
15-07-2012, 18:07
Wmv e mpg sono formati diversi da avi molto complessi da gestire. Cercare di gestirli a mano dal codice del tuo programma non è impossibile ma è incredibilmente difficile e ti porterebbe via mesi di tempo. Io ti consiglio di cercare un binario già compilato di ffmpeg e lanciarlo dal codice come stai facendo con copy.

pabloski
15-07-2012, 19:07
L'unica possibilità che hai è quella di usare una libreria come gstreamer http://gstreamer.freedesktop.org/

Alternative sono xine, mplayer e ffmpeg.

skeleton
16-07-2012, 10:39
Wmv e mpg sono formati diversi da avi molto complessi da gestire. Cercare di gestirli a mano dal codice del tuo programma non è impossibile ma è incredibilmente difficile e ti porterebbe via mesi di tempo. Io ti consiglio di cercare un binario già compilato di ffmpeg e lanciarlo dal codice come stai facendo con copy.

Ok, ho scaricato ffmpeg, ma poi girovagando su internet ho trovato la seguente riga di codice che potrebbe fare a caso mio:

$ mencoder *.avi -oac mp3lame -ovc xvid -xvidencopts pass=1 -o video_finale.avi

Ora vi chiedo, cos'è questo "mencoder"? Dove lo posso scaricare, perchè nonostante le mie ricerche c'ho capito ben poco :mc:
Esiste un comando simile per fare la stessa cosa con ffmpeg?

EDIT Ho trovato questo codice ffmpeg ffmpeg -i video1.mpeg -i video2.mpeg -vcodec copy -acodec copy -vcodec copy -acodec copy test12.mpeg -newvideo -newaudio
Ebbene, sembra elabori tutto, ma quando apro test12.mpeg mi mostra solo il primo video...

Traxsung
16-07-2012, 11:02
leggi qui:

http://en.wikipedia.org/wiki/MEncoder

skeleton
16-07-2012, 11:31
leggi qui:

http://en.wikipedia.org/wiki/MEncoder

Ho letto, ma non riesco comunque a risolvere.

pabloski
16-07-2012, 11:38
Quelli citati sono tutti programmi che manipolano i file video. Se ti serve semplicemente unire i file puoi usare quelli, altrimenti usi le librerie fornite da mplayer, ffmpeg o gstreamer.

Banalmente per unire più file avi faresti così mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi

skeleton
16-07-2012, 11:49
Quelli citati sono tutti programmi che manipolano i file video. Se ti serve semplicemente unire i file puoi usare quelli, altrimenti usi le librerie fornite da mplayer, ffmpeg o gstreamer.

Banalmente per unire più file avi faresti così mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi

Continuo a non capire dove posso trovare questo "mencoder", però...

banryu79
16-07-2012, 11:51
Continuo a non capire dove posso trovare questo "mencoder", però...
Leggendo qua: https://en.wikipedia.org/wiki/MEncoder
pare che sia incluso nella distribuzione di MPalyer.

skeleton
16-07-2012, 11:57
Leggendo qua: https://en.wikipedia.org/wiki/MEncoder
pare che sia incluso nella distribuzione di MPalyer.

Mmm, ok. Ma se volessi rendere "portabile" il mio programmino, potrei soltanto copiare il file "mencoder" nella cartella del mio .cpp, lasciando il tutto funzionante?

banryu79
16-07-2012, 12:11
Mmm, ok. Ma se volessi rendere "portabile" il mio programmino, potrei soltanto copiare il file "mencoder" nella cartella del mio .cpp, lasciando il tutto funzionante?
Bho, io per non saper ne leggere ne scrivere l'informazione qui sopra l'ho trovata spalmando la stringa "mencoder" in un motore di ricerca e leggendo un attimo la pagina wiki trovata.
Se ti interessa sapere di più prova a documentarti.

skeleton
16-07-2012, 12:19
Bho, io per non saper ne leggere ne scrivere l'informazione qui sopra l'ho trovata spalmando la stringa "mencoder" in un motore di ricerca e leggendo un attimo la pagina wiki trovata.
Se ti interessa sapere di più prova a documentarti.

Ho scaricato mplayer. Comprende il file interessato, e senza nessuna installazione particolare posso rendere il mio programma portabile :)

Grazie a tutti per l'aiuto, funziona tutto a meraviglia :)