Làm thế nào để nối hai tập tin flv?


15

Tôi muốn ghép hai tệp flv (được tải xuống từ Youtube.com) bằng các công cụ dòng lệnh của Linux.
Các ffmpeghướng dẫn là quá phức tạp, vì vậy tôi đã cố gắng mencodehướng dẫn .
Nhưng tôi nhận được một đầu ra trống. Tôi không biết làm thế nào để khắc phục vấn đề.

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 nguồn
Sebastian

Câu trả lời:


11

Cá nhân tôi sẽ làm điều này với ffmpeg's

Trình giải thích concat

Đầu tiên tạo một tệp có tên inputs.txtnhư thế này:

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

Sau đó sử dụng ffmpeg như vậy:

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

(Bạn có thể sử dụng output.flv, mặc dù MP4 là định dạng thường hữu ích hơn). Trình giải mã có sẵn trên các phiên bản của ffmpeg từ 1.1 trở đi. Nếu bạn muốn dính vào một phiên bản lỗi thời của ffmpeg vì một số lý do, bạn có thể sử dụng

Giao thức concat

Đây là một chút phức tạp. Container FLV không hỗ trợ nối ở cấp tập tin, vì vậy bạn sẽ cần phải remux để một container mà không - giống như một Transport Stream MPEG. Thật không may, với video h.264 và âm thanh AAC, bạn sẽ cần áp dụng một vài bộ lọc luồng bit.

Vì bạn đang dùng linux, bạn có thể sử dụng các ống có tên.

mkfifo temp0 temp1

Bạn sẽ cần thực hiện các thao tác sau trong ba cửa sổ tạm thời riêng biệt (hoặc các tab nếu trình giả lập thiết bị đầu cuối của bạn hỗ trợ chúng - ctrl+shift+tthường mở một tab mới):

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

Thực tế, bạn có thể chạy tất cả những thứ đó trên một dòng lệnh (trông khá phức tạp):

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

Hãy chắc chắn rằng output.mp4 không tồn tại, điều này sẽ không hoạt động. Nếu ai đó đang đọc cái này trên một hệ thống không hỗ trợ các ống có tên, họ sẽ phải sử dụng:

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

Điều này sẽ tạo ra một cặp tệp trung gian được gọi là temp0.ts và temp1.ts, có thể bị hủy an toàn khi bạn hoàn tất.

Lưu ý rằng các hướng dẫn này sẽ hoạt động đối với các tệp FLV được chỉ định trong OP và có lẽ hầu hết các FLV hiện đại từ internet, vì chúng hầu như sử dụng phổ biến video h264 và âm thanh aac. Đối với các codec khác, các hướng dẫn này sẽ phải được điều chỉnh một chút.


Câu trả lời tuyệt vời! Đây là cách duy nhất tôi quản lý để hợp nhất FLV mà không cần mã hóa lại video.
neu242

1
@DaveJarvis có lẽ bạn đang sử dụng một phiên bản cũ của ffmpeg (chẳng hạn như những phiên bản được cung cấp trong kho của hầu hết các bản phân phối Linux lớn). Từ nhận xét của bạn cho câu trả lời khác của tôi, tôi nghĩ rằng bạn đang sử dụng Debian hoặc Ubuntu (hoặc một công cụ phái sinh), thậm chí không chứa ffmpeg thật, nhưng là một phiên bản giả mạo và cố tình làm tê liệt từ nhóm libav (do một số khó chịu dự án chính trị giả mạo). Hãy thử với một phiên bản tĩnh của ffmpeg từ đây hoặc biên dịch riêng của bạn theo hướng dẫn trên wiki ffmpeg .
evilsoup

2

Bạn có khăng khăng sử dụng định dạng FLV? bạn có thể chuyển đổi chúng thành mpg hoặc một số định dạng khác (tham khảo cái này ) và sau đó tham gia chúng (tham khảo cái này ).

hoặc có thể bạn chỉ cần thử phương thức nối trực tiếp trên các tệp flv.

BIÊN TẬP

Đọc này hay này . Nó sử dụng một số thông số khác nhau cho MEncoder.


Cảm tạ. Nhưng phải mất nhiều không gian đĩa hơn để lưu trữ các tệp mpg. Và phải mất một thời gian dài để mã hóa. Tôi muốn nối hai tệp flv và sửa tiêu đề.
kev

đồng ý. phương thức nối trong liên kết của tôi có hoạt động với các tệp flv không (phương thức "cat").
tumchaaditya

1

Tôi tìm thấy gói python: http://pypi.python.org/pypi/vnc2flv/


flvcat.py

flvcat.pylà một chương trình chỉnh sửa đơn giản cho một bộ phim FLV. Nó hỗ trợ ghép nhiều phim, cắt kích thước khung hình của phim, lấy mẫu lại phim thành kích thước nhỏ hơn với chế độ tự động xoay, v.v. Cú pháp:

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

Đối với mỗi tệp phim, bạn có thể cắt các phần của phim để thêm bằng cách chỉ định phạm vi của phim. Phạm vi được phân tách bằng dấu phẩy, danh sách gạch nối của mili giây. Ví dụ,

out.flv:10000-20000 

nghĩa là clip dài 10 giây từ phim out.flv (0: 10-0: 20). Chỉ xác định một đầu của phạm vi cũng được hỗ trợ:

out.flv:10000- 

nghĩa là toàn bộ phim trừ 10 giây đầu tiên. Khi phạm vi được bỏ qua, toàn bộ phim được sử dụng.

Ví dụ:

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

Tùy chọn:

-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. 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.