Come concatenare due file flv?


15

Voglio concatenare due file flv (scaricati da Youtube.com) dagli strumenti della riga di comando di Linux.
Il ffmpegtutorial è troppo complicato, quindi ho provato il mencodetutorial .
Ma ho un output vuoto. Non so come risolvere il problema.

ffmpeg -i input_1.flv

ffmpeg version 0.8.1-4:0.8.1-0ubuntu1, Copyright (c) 2000-2011 the Libav developers
  built on Mar 22 2012 05:29:10 with gcc 4.6.3
This program is not developed anymore and is only provided for compatibility. Use avconv instead (see Changelog for the list of incompatible changes).
[flv @ 0x89faaa0] Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 59.94 (2997/50) -> 29.97 (30000/1001)
Input #0, flv, from 'input_1.flv':
  Metadata:
    starttime       : 0
    totalduration   : 173
    totaldatarate   : 457
    bytelength      : 9874241
    canseekontime   : true
    sourcedata      : B4A7D6704MH1334385311768958
    purl            : 
    pmsg            : 
  Duration: 00:02:52.83, start: 0.000000, bitrate: 459 kb/s
    Stream #0.0: Video: h264 (Main), yuv420p, 640x360 [PAR 1:1 DAR 16:9], 360 kb/s, 29.97 tbr, 1k tbn, 59.94 tbc
    Stream #0.1: Audio: aac, 44100 Hz, stereo, s16, 99 kb/s
At least one output file must be specified

ffmpeg -i input_2.flv

ffmpeg version 0.8.1-4:0.8.1-0ubuntu1, Copyright (c) 2000-2011 the Libav developers
  built on Mar 22 2012 05:29:10 with gcc 4.6.3
This program is not developed anymore and is only provided for compatibility. Use avconv instead (see Changelog for the list of incompatible changes).
[flv @ 0x85b7aa0] Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 59.94 (2997/50) -> 29.97 (30000/1001)
Input #0, flv, from 'input_2.flv':
  Metadata:
    starttime       : 0
    totalduration   : 488
    totaldatarate   : 254
    bytelength      : 15467674
    canseekontime   : true
    sourcedata      : BADC21903MH1334385484128583
    purl            : 
    pmsg            : 
  Duration: 00:08:07.54, start: 0.000000, bitrate: 250 kb/s
    Stream #0.0: Video: h264 (Main), yuv420p, 640x360 [PAR 1:1 DAR 16:9], 151 kb/s, 29.97 tbr, 1k tbn, 59.94 tbc
    Stream #0.1: Audio: aac, 44100 Hz, stereo, s16, 99 kb/s
At least one output file must be specified

mencoder -of lavf -oac copy -ovc copy -o output.flv input_1.flv input_2.flv

MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
success: format: 0  data: 0x0 - 0x96ab41
libavformat version 53.21.0 (external)
Mismatching header version 53.19.0
libavformat file format detected.
[flv @ 0xb6b09d80]Estimating duration from bitrate, this may be inaccurate
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0
VIDEO:  [H264]  640x360  0bpp  29.970 fps  360.0 kbps (43.9 kbyte/s)
[V] filefmt:44  fourcc:0x34363248  size:640x360  fps:29.970  ftime:=0.0334
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B-frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit.
videocodec: framecopy (640x360 0bpp fourcc=34363248)
Audio format 0x4134504d is incompatible with '-oac copy', please try '-oac pcm' instead or use '-fafmttag' to override it.

Exiting...

mencoder -of lavf -oac pcm -ovc copy -o output.flv input_1.flv input_2.flv

MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
success: format: 0  data: 0x0 - 0x96ab41
libavformat version 53.21.0 (external)
Mismatching header version 53.19.0
libavformat file format detected.
[flv @ 0xb6bb6d80]Estimating duration from bitrate, this may be inaccurate
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0
VIDEO:  [H264]  640x360  0bpp  29.970 fps  360.0 kbps (43.9 kbyte/s)
[V] filefmt:44  fourcc:0x34363248  size:640x360  fps:29.970  ftime:=0.0334
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 53.35.0 (external)
Mismatching header version 53.32.2
AUDIO: 44100 Hz, 2 ch, s16le, 99.0 kbit/7.02% (ratio: 12376->176400)
Selected audio codec: [ffaac] afm: ffmpeg (FFmpeg AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B-frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit.
videocodec: framecopy (640x360 0bpp fourcc=34363248)
VIDEO CODEC ID: 28
AUDIO CODEC ID: 2e, TAG: 0
Writing header...
[flv @ 0xb6bb6d80]Codec for stream 0 does not use global headers but container format requires global headers
[flv @ 0xb6bb6d80]Codec for stream 1 does not use global headers but container format requires global headers
[NULL @ 0xb6472380]codec not compatible with flv
Floating point exception (core dumped)

stat output.flv

  File: `output.flv'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 700h/1792d  Inode: 1722857     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/     kev)   Gid: ( 1000/     kev)
Access: 2012-05-04 10:44:45.153319669 +0800
Modify: 2012-05-04 10:44:45.153319669 +0800
Change: 2012-05-04 10:44:45.153319669 +0800
 Birth: -

mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv clip1.flv clip2.flv clip3.flv fonte
Sebastian,

Risposte:


11

Personalmente lo farei con ffmpeg

Demolitore Concat

Per prima cosa crea un file chiamato inputs.txtche assomiglia a questo:

file 'input1.flv'
file 'input2.flv'

Quindi usa ffmpeg in questo modo:

ffmpeg -f concat -i inputs.txt -c copy output.mp4

possibile utilizzare output.flv, anche se MP4 è un formato generalmente più utile). Il demuxer è disponibile su versioni di ffmpeg dall'1.1 in poi. Se si desidera attenersi a una versione obsoleta di ffmpeg per qualche motivo, è possibile utilizzare

Protocollo Concat

Questo è un po 'complicato. Il contenitore FLV non supporta la concatenazione a livello di file, quindi è necessario rimappare in un contenitore che lo faccia , come un flusso di trasporto MPEG. Sfortunatamente, con il video h.264 e l'audio AAC, dovrai applicare un paio di filtri stream bit.

Dato che sei su Linux, puoi usare named pipe.

mkfifo temp0 temp1

Dovrai eseguire le seguenti operazioni in tre finestre teminali separate (o schede se l'emulatore di terminale le supporta: ctrl+shift+tnormalmente apre una nuova scheda):

ffmpeg -i input0.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp0

ffmpeg -i input1.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp1

ffmpeg -f mpegts -i "concat:temp0|temp1" -c copy -absf aac_adtstoasc output.mp4

Puoi, infatti, eseguirli tutti su una riga di comando (piuttosto complicata):

ffmpeg -i input0.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp0 2> /dev/null & \
ffmpeg -i input1.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb -y temp1 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp0|temp1" -c copy -absf aac_adtstoasc output.mp4

Assicurati che output.mp4 non esista già, di questo non funzionerà. Se qualcuno sta leggendo questo è su un sistema che non supporta named pipe, dovrebbe usare:

ffmpeg -i input0.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb temp0.ts
ffmpeg -i input1.flv -map 0 -c copy -f mpegts -bsf h264_mp4toannexb temp1.ts
ffmpeg -i "concat:temp0.ts|temp1.ts" -c copy -absf aac_adtstoasc output.mp4

Questo creerà una coppia di file intermedi chiamati temp0.ts e temp1.ts, che possono essere tranquillamente distrutti quando hai finito.

Si noti che queste istruzioni funzioneranno per i file FLV specificati nell'OP e probabilmente per i FLV più moderni da Internet, poiché utilizzano quasi universalmente video h264 e audio aac. Per altri codec, queste istruzioni dovranno essere leggermente modificate.


Risposta fantastica! Questo è stato l'unico modo in cui sono riuscito a unire i FLV senza ricodificare il video.
neu242

1
@DaveJarvis stai probabilmente usando una vecchia versione di ffmpeg (come quelli forniti nei repository della maggior parte delle distro Linux). Dal tuo commento a un'altra delle mie risposte, penso che tu stia usando Debian o Ubuntu (o un derivato), che non contiene nemmeno il vero ffmpeg, ma una versione falsa e deliberatamente paralizzata del team libav (a causa di alcuni cattivi politica di biforcazione del progetto). Prova con una versione statica di ffmpeg da qui o compila la tua seguendo le istruzioni sul wiki di ffmpeg .
evilsoup,

2

Insistete sull'uso del formato FLV? puoi convertirli in mpg o in altri formati (fare riferimento a questo ) e quindi unirli (fare riferimento a questo ).

o forse puoi semplicemente provare il metodo di giunzione direttamente sui file flv.

MODIFICARE

Leggi questo o questo . Utilizza alcuni parametri diversi per MEncoder.


Grazie. Ma ci vuole più spazio su disco per archiviare i file mpg. E ci vuole molto tempo per la codifica. Voglio concatenare due file FLV e correggere l'intestazione.
kev

ok. il metodo di unione nel mio collegamento funziona con i file flv? (il metodo "cat").
tumchaaditya

1

Ho trovato un pacchetto python: http://pypi.python.org/pypi/vnc2flv/


flvcat.py

flvcat.pyè un programma di editing semplicistico per un film FLV. Supporta la concatenazione di più filmati, il ritaglio delle dimensioni dei fotogrammi di un filmato, il ricampionamento di un filmato in dimensioni inferiori con il panning automatico, ecc. Sintassi:

flvcat.py [options] src1[:ranges1] src2[:ranges2] ... output 

Per ogni file di filmato, è possibile tagliare le parti del filmato da aggiungere specificandone gli intervalli. Ranges è un elenco di millisecondi separato da virgole. Per esempio,

out.flv:10000-20000 

indica una clip di 10 secondi dal film out.flv (0: 10-0: 20). È anche supportato specificare solo un'estremità dell'intervallo:

out.flv:10000- 

indica l'intero film tranne i primi 10 secondi. Quando le gamme vengono omesse, viene utilizzato l'intero filmato.

Esempi:

$ flvcat.py movie1.flv movie2.flv output.flv
(Concatenate movie1.flv and movie2.flv and save it as output.flv)

$ flvcat.py -W 640x480 movie1.flv output.flv
(Resize the movie1.flv with auto-panning with its window size 640x480 and save it as output.flv)

$ flvcat.py movie1.flv:15000-30000 output.flv
(Clip the part of movie1.flv from 0:15 to 0:30 and save it as output.flv)

$ flvcat.py movie1.flv:2500- output.flv
(Chop the first 2.5 seconds off and save it as output.flv)

Opzioni:

-r fps
    Specifies the number of frames per second. (default: 15) 
-K keyframe
    Specifies the rate of key frames that is inserted in every this number of frames. (default: every 150 frames) 
-B blocksize
    Specifies the block size. (default: 32) 
-C wxh{+|-}x{+|-}y
    Specifies the clipping. (default: entire frame) 
-W wxh
    Specifies the window size for auto panning. Auto panning tracks the changes in the screen and tries to focus on the active part of the screen. This helps reducing the movie screen size. (default: no auto panning) 
-S speed
    Specifies the speed of auto panning. (default: 60 frames) 
-f
    Forces overwriting the output file. 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.