Jak połączyć dwa pliki FLV?

15

Chcę połączyć dwa pliki flv (pobrane z Youtube.com) za pomocą narzędzi wiersza polecenia systemu Linux. Poradnik jest zbyt skomplikowane, więc próbowałem samouczek . Ale dostaję pusty wynik. Nie wiem jak rozwiązać problem.
ffmpegmencode

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: -
kev
źródło
mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv clip1.flv clip2.flv clip3.flv źródło
Sebastian

Odpowiedzi:

11

Osobiście zrobiłbym to z ffmpeg

Demultiplekser Concat

Najpierw utwórz plik o nazwie, inputs.txtktóry wygląda następująco:

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

Następnie użyj ffmpeg w następujący sposób:

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

(Ty możesz używać output.flv, choć MP4 jest na ogół bardziej użyteczny format). Demuxer jest dostępny w wersjach ffmpeg od wersji 1.1. Jeśli chcesz trzymać się przestarzałej wersji ffmpeg z jakiegoś powodu, możesz użyć

Protokół Concat

To jest trochę skomplikowane. Kontener FLV nie obsługuje konkatenacji na poziomie pliku, więc musisz przebudować na kontener, który obsługuje - podobnie jak MPEG Transport Stream. Niestety, w przypadku wideo h.264 i dźwięku AAC musisz zastosować kilka filtrów strumienia bitów.

Ponieważ korzystasz z systemu Linux, możesz używać nazwanych potoków.

mkfifo temp0 temp1

Musisz wykonać następujące czynności w trzech osobnych oknach teminal (lub kartach, jeśli obsługuje je emulator terminala - ctrl+shift+tzwykle otwiera nową kartę):

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

Możesz w rzeczywistości uruchomić wszystkie z nich w jednym (raczej skomplikowanym) wierszu poleceń:

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

Upewnij się, że output.mp4 jeszcze nie istnieje, z tego nie będzie działać. Jeśli ktoś czyta to w systemie, który nie obsługuje nazwanych potoków, musiałby użyć:

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

Spowoduje to utworzenie pary plików pośrednich o nazwie temp0.ts i temp1.ts, które można bezpiecznie zniszczyć po zakończeniu.

Zauważ, że te instrukcje będą działać dla plików FLV określonych w OP i prawdopodobnie większości współczesnych plików FLV z Internetu, ponieważ prawie powszechnie używają wideo h264 i audio AAC. W przypadku innych kodeków instrukcje te trzeba będzie nieco zmodyfikować.

zła
źródło
Fantastyczna odpowiedź! To był jedyny sposób, w jaki udało mi się połączyć pliki FLV bez przekodowywania wideo.
neu242,
1
@DaveJarvis prawdopodobnie używasz starej wersji ffmpeg (takiej jak te dostępne w repozytoriach większości głównych dystrybucji Linuksa). Od twojego komentarza do innej z moich odpowiedzi, myślę, że używasz Debiana lub Ubuntu (lub pochodnej), która nawet nie zawiera prawdziwego ffmpeg, ale fałszywą i celowo okaleczoną wersję z zespołu libav (z powodu niektórych paskudnych polityka rozwidlania projektów). Spróbuj użyć statycznej wersji ffmpeg stąd lub skompiluj własną, postępując zgodnie z instrukcjami na wiki ffmpeg .
evilsoup
2

Czy nalegasz na użycie formatu FLV? możesz je przekonwertować do formatu mpg lub innego formatu (zapoznaj się z tym ), a następnie dołącz do nich (zapoznaj się z tym ).

lub być może możesz po prostu wypróbować metodę łączenia bezpośrednio na plikach flv.

EDYTOWAĆ

Przeczytaj to lub tamto . Używa różnych parametrów dla MEncodera.

tumchaaditya
źródło
Podziękować. Ale zajmuje więcej miejsca na dysku do przechowywania plików mpg. Kodowanie zajmuje dużo czasu. Chcę połączyć dwa pliki flv i naprawić nagłówek.
kev
dobrze. czy metoda łączenia w moim łączu działa z plikami flv? (metoda „cat”).
tumchaaditya
1

Znalazłem pakiet python: http://pypi.python.org/pypi/vnc2flv/


flvcat.py

flvcat.pyto uproszczony program do edycji filmu FLV. Obsługuje konkatenację wielu filmów, przycinanie klatki filmu, ponowne próbkowanie filmu do mniejszego rozmiaru z automatycznym panoramowaniem itp. Składnia:

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

Dla każdego pliku filmu możesz przyciąć części filmu, które chcesz dodać, określając jego zakresy. Zakresy to rozdzielona przecinkami, dzielona lista milisekund. Na przykład,

out.flv:10000-20000 

oznacza 10-sekundowy klip z filmu out.flv (0: 10-0: 20). Obsługiwane jest również określanie tylko jednego końca zakresu:

out.flv:10000- 

oznacza cały film oprócz pierwszych 10 sekund. Pominięcie zakresu powoduje wykorzystanie całego filmu.

Przykłady:

$ 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)

Opcje:

-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. 
kev
źródło