Kết nối hai tập tin mp4 với ffmpeg mà không làm giảm chất lượng


16

Tôi muốn ghép 2 video bằng ffmpeg. Tôi đang dùng:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

Nhưng tập tin mp4 tôi nhận được trông tệ hơn nhiều so với tập tin nguồn.

Đây là thông tin về cả hai tập tin

   Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
   Metadata:
   major_brand     : isom
   minor_version   : 1
   compatible_brands: isom
   creation_time   : 2013-06-13 15:40:36
   Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
   Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr,   12800 tbn, 50 tbc
   Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s

  Input #0, mpegts, from 'i0.ts':
  Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
  Program 1 
  Metadata:
  service_name    : Service01
  service_provider: Libav
  Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

Làm thế nào tôi có thể giải quyết vấn đề này?


Bạn đang cố gắng để làm chính xác? Thuật ngữ "concat" có nghĩa là tham gia một số tệp, nhưng bạn chỉ đề cập đến một đầu vào output1.mp4và một đầu ra , i0.ts. Mã hóa sang bộ chứa đầu ra ts sẽ sử dụng mpeg2videobộ mã hóa theo mặc định (ít nhất là với bản dựng của bạn) và lần trước tôi đã kiểm tra cài đặt bitrate hoặc chất lượng mặc định cho bộ mã hóa này -b:v 200klà quá thấp đối với hầu hết các trường hợp.
llogan

lấy làm tiếc. Sau đó, tôi ghép chúng với ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Nhưng vấn đề là chất lượng đã tệ khi tôi tạo các tập tin ts

Bạn có thể không cần phải mã hóa lại video MPEG-2. Có phải tất cả các đầu vào ban đầu của bạn ( output1.mp4, v.v.) có cùng định dạng, tốc độ khung hình và kích thước khung hình không?
llogan

đúng chính xác. Tất cả đều

Câu trả lời:


36

Cân nhắc sử dụng bộ concatkhử . Bằng cách này, bạn có thể tránh việc tạo các tệp trung gian tạm thời, mất dữ liệu và bỏ qua một bước bổ sung của mã hóa lại.

Lưu ý: Tất cả các đầu vào phải có cùng loại luồng (cùng định dạng, cùng thời gian, v.v.).

  1. Tạo một tệp văn bản và bao gồm các đường dẫn và tên của mỗi tệp để ghép (hoặc "tham gia"). Tệp ví dụ , input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Bây giờ bạn có thể sử dụng bộ giải concatmã:

    ffmpeg -f concat -i input.txt -codec copy output.mp4
    

Nếu bạn không có tính năng này, thì ffmpeg của bạn đã quá cũ hoặc bạn đang sử dụng một ffmpeg "giả" từ ngã ba libav.

Các bản dựng tĩnh dễ sử dụng có sẵn cho Linux, OS X và Windows thông qua trang tải xuống FFmpeg hoặc bạn có thể làm theo hướng dẫn từng bước để biên dịch ffmpeg .

Cũng thấy:


Đây chính xác là những gì tôi muốn và giúp tôi hợp nhất 2 tệp .mov từ iPhone 6. Cảm ơn.
Ryan

7

Cách nhanh nhất 1 lớp sẽ là:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

Bất kỳ cơ hội để có được một dòng lệnh 1-onliner cho windows?
PeterCo

2
Trên Linux tôi đã sử dụng oneliner này: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv chấp nhận nhiều codec hơn mp4, nhưng bạn cũng có thể thử nó với mp4). Các -safe 0là dành cho phiên bản ffmpeg gần đây phàn nàn về tên file không an toàn , và -type fchỉ dành cho danh sách tập tin. Tôi đã thêm | sortđể sắp xếp các tập tin theo thứ tự abc; bởi vì findđọc chúng theo thứ tự như được lưu trên hệ thống tập tin. Hoạt động cũng cho các tập tin với khoảng trắng.
erik
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.