FFMPEG mux video và âm thanh (từ một video khác) - sự cố ánh xạ


81

Tôi muốn chuyển âm thanh từ video này sang video khác mà không có âm thanh (trong một lệnh):

ffmpeg.exe -i video1_noAudio.mov -i video2_wAudio.mov -vcodec copy -acodec copy video1_audioFromVideo2.mov

Tôi đoán "-map" là cách chính xác để làm điều đó nhưng tôi đã nhầm lẫn với nó.

Bạn có thể đề nghị làm thế nào để giải quyết nó?

Câu trả lời:


220

Tổng quan về đầu vào

input_0.mp4có luồng video mong muốn và input_1.mp4có luồng âm thanh mong muốn:

sơ đồ ánh xạ

Trong ffmpegcác luồng trông như thế này:

$ ffmpeg -i input_0.mp4 -i input_1.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_0.mp4':
  Duration: 00:01:48.50, start: 0.000000, bitrate: 4144 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 4014 kb/s, SAR 115:87 DAR 1840:783, 23.98 fps, 23.98 tbr, 16k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 124 kb/s (default)

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input_1.mp4':
  Duration: 00:00:30.05, start: 0.000000, bitrate: 1754 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 8:9 DAR 4:3], 1687 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)

Số ID

ffmpegđề cập đến các tệp và luồng đầu vào có số chỉ mục. Định dạng là input_file_id:input_stream_id. Vì ffmpegbắt đầu đếm từ 0, luồng 1:1đề cập đến âm thanh từ input_1.mp4.

Bộ chỉ định luồng

Điều này có thể được tăng cường với các chỉ định luồng . Ví dụ: bạn có thể cho biết ffmpegrằng bạn muốn luồng video đầu tiên từ đầu vào đầu tiên ( 0:v:0) và luồng âm thanh đầu tiên từ đầu vào thứ hai ( 1:a:0). Tôi thích phương pháp này hơn vì nó hiệu quả hơn. Ngoài ra, nó ít bị ánh xạ ngẫu nhiên hơn vì 1:1có thể tham chiếu đến bất kỳ loại luồng nào, trong khi 2:v:3chỉ đề cập đến luồng video thứ tư của tệp đầu vào thứ ba.

Ví dụ

Các -map tùy chọn chỉ thị ffmpeggì suối mà bạn muốn. Để sao chép video input_0.mp4và âm thanh từ input_1.mp4:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

Ví dụ tiếp theo này sẽ làm điều tương tự:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:v:0 -map 1:a:0 -shortest out.mp4
  • -map 0:v:0 có thể được dịch là: từ đầu vào đầu tiên (0 ), chọn loại luồng video ( v), luồng video đầu tiên ( 0)

  • -map 1:a:0 có thể được dịch là: từ đầu vào thứ hai (1 ), chọn loại luồng âm thanh ( a), luồng âm thanh đầu tiên ( 0)

Ghi chú bổ sung

  • Với -c copycác luồng sẽ được sao chép luồng , không bị mã hóa lại nên sẽ không bị giảm chất lượng. Nếu bạn muốn mã hóa lại, hãy xem Hướng dẫn mã hóa FFmpeg Wiki: H.264 .

  • Các -shortesttùy chọn sẽ gây ra trong suốt thời gian đầu ra để phù hợp với thời gian của dòng đầu vào ngắn nhất.

  • Xem -maptài liệu tùy chọn để biết thêm thông tin.


17
Được ủng hộ, bởi vì đây là mô tả + ví dụ tốt nhất mà tôi thấy đã cố gắng làm điều này trong nhiều giờ.
Mark Ping

4
Cảm ơn vì không chỉ giải quyết nó mà còn giải thích nó!
Mathias

1
Cách giải thích này là hoàn hảo cho người mới bắt đầu -map
seed_87


2
@FernandoEspinosa Bản chỉnh sửa thực sự không chính xác. -map 1:0sẽ giới thiệu video input_1.mp4chứ không phải âm thanh. Ví dụ sẽ nhận được âm thanh, vì vậy nó phải có -map 1:1hoặc -map 1:a:0trong trường hợp này dẫn đến việc nhận được luồng âm thanh mong muốn. Tham khảo hình ảnh trong câu trả lời để có hình ảnh minh họa.
llogan

1

Tôi có một lệnh mới để hợp nhất âm thanh vào video

ffmpeg -i video.mp4 -i audio.mp4 -map 0.0 -map 1.0 -acodec copy -qscale 4 -vcodec mpeg4 outvideo.mp4

-qscale là tùy chọn đặt chất lượng thành video của ffmpeg

-acodec copy là tùy chọn sao chép chất lượng mặc định của âm thanh để xuất video

-vcodec mpeg4 là tùy chọn sao chép chất lượng mặc định của video để xuất video


1
-vcodecđã tồn tại mãi mãi. Nó giống với các bí danh mới hơn -codec:v-c:v.
llogan

@HoangHieu tôi có thể thêm âm thanh wav vào video mp4 được không? Tôi đã thử ffmpeg -i 1.mp4 -i 0.wav -map 0 -map 1 -codec copy -shortest new.mp4lệnh nhưng không hoạt động
Allan

?? lệnh của bạn. 0.0 not 0 , 1.0 not 1 - 1.0 it mean: index [1] channel [0] ... - acodec copy not -codec copy , it mean copy audio codec
HoangHieu

Có thể bạn muốn -vcodec copytránh mã hóa lại video
wolfd 14/07/17

0

Như một câu trả lời bổ sung cụ thể cho MKV:

MKVToolnix có thể làm được điều đó. Tôi thích GUI hơn.

Khi video đầu tiên đã được thêm, hãy thêm video thứ hai ("Thêm tệp nguồn"), sau đó chỉ giữ lại các luồng mong muốn đã chọn và nhấn "Bắt đầu ghép kênh".

nhập mô tả hình ảnh ở đây

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.