Bagaimana cara menggabungkan dua file flv?

15

Saya ingin menggabungkan dua file flv (diunduh dari Youtube.com) oleh alat baris perintah Linux.
The ffmpegtutorial terlalu rumit, jadi aku mencoba mencodetutorial .
Tapi saya mendapatkan output kosong. Saya tidak tahu cara memperbaiki masalah.

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
sumber
mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv clip1.flv clip2.flv clip3.flv sumber
Sebastian

Jawaban:

11

Saya pribadi akan melakukan ini dengan ffmpeg

Demuxer perhatian

Pertama buat file bernama inputs.txtyang terlihat seperti ini:

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

Kemudian gunakan ffmpeg seperti:

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

(Anda dapat menggunakan output.flv, meskipun MP4 adalah format yang umumnya lebih bermanfaat). Demuxer tersedia pada versi ffmpeg mulai dari 1.1 dan seterusnya. Jika Anda ingin tetap menggunakan versi ffmpeg yang sudah usang karena beberapa alasan, Anda dapat menggunakan

Protokol concat

Ini agak rumit. Wadah FLV tidak mendukung Rangkaian pada tingkat file, sehingga Anda harus remux ke wadah yang tidak - seperti Transport Stream MPEG. Sayangnya, dengan video h.264 dan audio AAC, Anda harus menerapkan beberapa filter bit stream.

Karena Anda menggunakan linux, Anda dapat menggunakan pipa bernama.

mkfifo temp0 temp1

Anda harus melakukan hal berikut dalam tiga jendela teminal terpisah (atau tab jika emulator terminal Anda mendukungnya - ctrl+shift+tbiasanya membuka tab baru):

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

Anda dapat, pada kenyataannya, menjalankan semua itu pada satu baris perintah (yang tampak rumit):

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

Pastikan output.mp4 belum ada, ini tidak akan berfungsi. Jika seseorang membaca ini pada sistem yang tidak mendukung pipa bernama, mereka harus menggunakan:

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

Ini akan membuat sepasang file perantara yang disebut temp0.ts dan temp1.ts, yang dapat dihancurkan dengan aman ketika Anda selesai.

Perhatikan bahwa petunjuk ini akan berfungsi untuk file FLV yang ditentukan dalam OP, dan mungkin FLV paling modern dari internet, karena hampir secara universal menggunakan video h264 dan audio aac. Untuk codec lain, instruksi ini harus sedikit di-tweak.

Evilsoup
sumber
Jawaban yang fantastis! Ini adalah satu-satunya cara saya berhasil menggabungkan FLV tanpa pengodean ulang video.
neu242
1
@DaveJarvis Anda mungkin menggunakan ffmpeg versi lama (seperti yang disediakan di repositori sebagian besar distro Linux utama). Dari komentar Anda ke jawaban saya yang lain saya pikir Anda menggunakan baik Debian atau Ubuntu (atau turunan), yang bahkan tidak mengandung ffmpeg nyata, tetapi versi palsu dan sengaja dilumpuhkan dari tim libav (karena beberapa hal yang tidak menyenangkan) politik forking-proyek). Coba dengan ffmpeg versi statis dari sini , atau kompilasi sendiri mengikuti instruksi pada wiki ffmpeg .
evilsoup
2

Apakah Anda bersikeras menggunakan format FLV? Anda dapat mengonversikannya ke mpg atau format lain (rujuk ini ) dan kemudian bergabung dengan mereka (rujuk ini ).

atau mungkin Anda bisa mencoba metode bergabung langsung pada file flv.

EDIT

Baca ini atau ini . Ini menggunakan beberapa parameter berbeda untuk MEncoder.

tumchaaditya
sumber
Terima kasih Tetapi dibutuhkan lebih banyak ruang disk untuk menyimpan file mpg. Dan butuh waktu lama untuk encoding. Saya ingin menggabungkan dua file flv, dan memperbaiki header.
kev
baik. apakah metode bergabung dalam tautan saya berfungsi dengan file flv? (metode "cat").
tumchaaditya
1

Saya menemukan paket python: http://pypi.python.org/pypi/vnc2flv/


flvcat.py

flvcat.pyadalah program pengeditan sederhana untuk film FLV. Ini mendukung penggabungan banyak film, kliping ukuran bingkai film, pengambilan sampel ulang film ke ukuran yang lebih kecil dengan auto-panning, dll. Sintaks:

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

Untuk setiap file film, Anda dapat memotong bagian-bagian film untuk ditambahkan dengan menentukan rentangnya. Ranges adalah daftar milidetik terpisah yang dipisahkan koma. Sebagai contoh,

out.flv:10000-20000 

berarti klip 10 detik dari film out.flv (0: 10-0: 20). Menentukan hanya satu ujung rentang yang didukung:

out.flv:10000- 

berarti seluruh film kecuali 10 detik pertama. Ketika rentang dihilangkan, seluruh film digunakan.

Contoh:

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

Pilihan:

-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
sumber