Trong ffmpeg, làm thế nào để chỉ trì hoãn âm thanh của video .mp4 mà không chuyển đổi âm thanh?


44

Trong tệp .mp4 của tôi, độ trễ âm thanh là -3840 ms. Tôi đã đồng bộ hóa nó trong KMplayer và tôi không muốn sử dụng MKVGUI để tạo tệp .mkv. Tôi chỉ cần trì hoãn âm thanh trong khoảng -3840 ms, mọi thứ khác vẫn còn nguyên.
Điều gì sẽ là lệnh đúng để thực hiện điều này bằng cách sử dụng ffmpeg?
Tôi sẽ đánh giá cao sự giúp đỡ của bạn.

Câu trả lời:


72

Nếu bạn cần trì hoãn video thêm 3,84 giây, hãy sử dụng lệnh như thế này:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 1:v -map 0:a -c copy "movie-video-delayed.mp4"

Nếu bạn cần trì hoãn âm thanh thêm 3,84 giây, hãy sử dụng lệnh như sau:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 0:v -map 1:a -c copy "movie-audio-delayed.mp4"

Hãy chắc chắn rằng bản dựng ffmpeg của bạn không quá cũ, mới hơn 2012 sẽ đủ.


Giải trình

-itsoffset 3.84 -i "movie.mp4"

Bù trừ dấu thời gian của tất cả các luồng bằng 3,84 giây trong tệp đầu vào theo tùy chọn (movie.mp4).

-map 1:v -map 0:a

Lấy luồng video từ đầu vào thứ hai (bị trì hoãn) và luồng âm thanh từ đầu vào đầu tiên - tất nhiên cả hai đầu vào có thể là cùng một tệp.

Một lời giải thích dài dòng hơn có thể được tìm thấy ở đây:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/


2
Làm thế nào để bạn chọn một bản nhạc cụ thể thay vì trì hoãn tất cả các bản âm thanh?
Freedo

1
Sử dụng các khả năng của tùy chọn bản đồ . Trước tiên, bạn cần tìm chỉ mục của luồng âm thanh mong muốn trong tệp đầu vào bằng bất kỳ lệnh nào sau đây: ffprobe.exe "input_file.mp4"hoặc ffmpeg.exe -i "input_file.mp4" giả sử rằng chỉ số của luồng âm thanh bị trì hoãn là 2 (tức là luồng thứ ba) và đầu vào bị trễ là cái thứ hai (như trong ví dụ của tôi). Để chỉ trì hoãn luồng thứ ba, hãy lấy tất cả các luồng khác từ đầu vào đầu tiên và chỉ một luồng âm thanh từ đầu vào thứ hai (bị trì hoãn):-map 0:0 -map 0:1 -map 1:2
Weaver

đó không phải là ý tôi. Trong trường hợp này tôi vẫn phải gọi ffmpeg và phân tích kết quả để tìm chỉ mục. Có tương đương với nói -map eng
Freedo

Chà, @Freedo, như bạn đã được thông báo trong superuser.com/questions/639402/ , trên thực tế, những gì bạn đề xuất là có thể bằng cách chỉ định các luồng sử dụng các giá trị siêu dữ liệu, ví dụ: -map 1:m:language:eng hãy nhớ rằng nó sẽ chọn tất cả các luồng đáp ứng tiêu chí, có thể bao gồm nhiều luồng âm thanh và / hoặc phụ đề. Bạn có thể tìm thêm thông tin trong stackoverflow.com/questions/46769419/ trên
Weaver

1
AFAIK -c copycó thể được sử dụng thay thế -vcodec copy -acodec copyitsoffsetchỉ ảnh hưởng đến video, vì vậy có lẽ điều này sẽ hoạt động tương tự?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"Và để trì hoãn âm thanh thay vì chỉ thêm một dấu âm vào thời lượng : -3.84.
miyalys 16/03/18

0

Tạo âm thanh im lặng đầu tiên:

ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 3 silence_3_sec.mp3

Sau đó tập tin concat:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
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.