İki flv dosyası nasıl birleştirilir?


15

İki flv dosyasını (Youtube.com'dan indirilen) Linux komut satırı araçlarıyla birleştirmek istiyorum. Öğretici Denedim yüzden de karmaşık öğretici . Ama boş bir çıktı alıyorum. Sorunu nasıl çözeceğimi bilmiyorum.
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: -

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

Yanıtlar:


11

Şahsen bunu ffmpeg ile yapardım

Concat demuxer

Önce şu şekilde adlandırılan bir dosya oluşturun inputs.txt:

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

Sonra şu şekilde ffmpeg kullanın:

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

(Bunu yapabilirsiniz kullanmak output.flvMP4 genel olarak daha kullanışlı biçimidir olsa). Demuxer, 1.1'den sonraki ffmpeg sürümlerinde kullanılabilir. Herhangi bir nedenden dolayı eski bir ffmpeg sürümüne bağlı kalmak istiyorsanız,

Concat protokolü

Bu biraz karmaşık. Bir kaba remux gerekir böylece FLV konteyner, dosya düzeyinde birleştirme desteklemiyor mu bir MPEG Taşıma Akışı gibi -. Ne yazık ki, h.264 video ve AAC ses ile birkaç bit akışı filtresi uygulamanız gerekir.

Linux'ta olduğunuz için adlandırılmış kanallar kullanabilirsiniz.

mkfifo temp0 temp1

Aşağıdakileri üç ayrı teminal pencerede yapmanız gerekir (veya terminal öykünücünüz destekliyorsa sekmeler - ctrl+shift+tnormalde yeni bir sekme açar):

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

Aslında, hepsini tek bir komut satırında (oldukça karmaşık görünümlü) çalıştırabilirsiniz:

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

Output.mp4 dosyasının zaten mevcut olmadığından emin olun, bunun işe yaramayacağını. Birisi bunu okuyorsa, adlandırılmış yöneltmeleri desteklemeyen bir sistemdeyse, kullanmaları gerekir:

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

Bu işlem tamamlandığında güvenli bir şekilde imha edilebilen temp0.ts ve temp1.ts adlı bir çift ara dosya oluşturur.

Bu talimatların OP'de belirtilen FLV dosyaları ve muhtemelen internetten çoğu modern FLV için çalışacağını unutmayın, çünkü neredeyse evrensel olarak h264 video ve aac ses kullanırlar. Diğer codec bileşenleri için bu talimatların biraz değiştirilmesi gerekir.


Harika cevap! FLV'leri videoyu yeniden kodlamadan birleştirmeyi başarabilmemin tek yolu buydu.
neu242

1
@DaveJarvis muhtemelen ffmpeg'in eski bir sürümünü kullanıyorsunuz (en büyük Linux dağıtımlarının depolarında sağlananlar gibi). Yorumunuzdan yanıtlarımdan bir diğerine, gerçek ffmpeg'i bile içermeyen Debian veya Ubuntu (veya bir türev) kullandığınızı, ancak libav ekibinden sahte ve kasıtlı olarak sakatlanmış bir versiyon kullandığınızı düşünüyorum. proje politikaları). Buradan ffmpeg'in statik bir sürümünü deneyin veya ffmpeg wiki'deki talimatları izleyerek kendiniz derleyin .
13:23

2

FLV formatını kullanmakta ısrar ediyor musunuz? Eğer mpg veya başka biçime dönüştürmek olabilir (bakınız bu ) ve daha sonra (bkz onlara katılmak bu ).

veya doğrudan flv dosyalarında katılma yöntemini deneyebilirsiniz.

DÜZENLE

Bunu veya bunu okuyun . MEncoder için bazı farklı parametreler kullanır.


Teşekkür. Ancak mpg dosyalarını saklamak için daha fazla disk alanı gerekir. Kodlama uzun zaman alıyor. İki flv dosyasını birleştirmek ve başlığı düzeltmek istiyorum.
kev

tamam. bağlantımdaki birleştirme yöntemi flv dosyalarıyla çalışıyor mu? ("cat" yöntemi).
tumchaaditya

1

Bir python paketi buldum: http://pypi.python.org/pypi/vnc2flv/


flvcat.py

flvcat.pybir FLV filmi için basit bir düzenleme programıdır. Birden fazla filmi birleştirmeyi, bir filmin kare boyutunu kırpmayı, bir filmi otomatik kaydırma ile daha küçük bir boyuta yeniden örneklemeyi vb. Destekler. Sözdizimi:

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

Her film dosyası için, aralıklarını belirterek filmin eklenecek kısımlarını kırpabilirsiniz. Aralık, virgülle ayrılmış, tireli milisaniyeler listesidir. Örneğin,

out.flv:10000-20000 

film out.flv'den (0: 10-0: 20) 10 saniyelik bir klip anlamına gelir. Aralığın yalnızca bir ucunun belirtilmesi de desteklenir:

out.flv:10000- 

ilk 10 saniye dışındaki tüm film anlamına gelir. Aralıklar atlandığında filmin tamamı kullanılır.

Örnekler:

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

Seçenekler:

-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. 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.