Làm cách nào để trích xuất âm thanh từ video bằng ffmpeg?


227

Tôi đã thử lệnh sau để trích xuất âm thanh từ video:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

nhưng tôi nhận được đầu ra sau

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

Ai có thể giúp tôi không?

Câu trả lời:


406

Để trích xuất luồng âm thanh mà không cần mã hóa lại:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn không có video
  • -acodec copy nói sử dụng cùng một luồng âm thanh đã có trong đó.

Đọc đầu ra để xem nó là codec gì, để đặt phần mở rộng tên tệp đúng.


54
và thay vì chạy ffmpeg lần đầu tiên chỉ để kiểm tra xem luồng âm thanh đó là gì, hãy sử dụng ffprobe input-video.avi
FlorianB

15
Nếu bạn chỉ trích xuất âm thanh từ luồng video, độ dài của âm thanh có thể ngắn hơn độ dài của video. Để đảm bảo điều này không xảy ra, giải nén cả âm thanh và video với các cuộc gọi tương tự để ffmpeg, ví dụ: "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender

2
Sẽ thật tuyệt khi mở rộng câu trả lời này bằng một lệnh cũng gói gọn AAC thô vào một thùng chứa M4A.
Gras Double

8
Trong trường hợp chính xác này, chỉ cần thay ".aac" bằng ".m4a" trong đường dẫn đích. ffmpeg đủ thông minh để đoán ý định của bạn và nó gói gọn kết quả vào một thùng chứa M4A :)
Gras Double

1
FWIW, tôi đã tạo một tập lệnh PHP, để tôi chỉ định tệp video đầu vào và nó tự động xác định phần mở rộng của tệp âm thanh đầu ra: superuser.com/questions/1301901/ trộm
Gras Double

117

Để mã hóa MP3 chất lượng cao từ AVI sử dụng tốt nhất -q: a cho tốc độ bit thay đổi:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Nếu bạn muốn trích xuất một phần âm thanh từ video, hãy sử dụng tùy chọn -ss để chỉ định dấu thời gian bắt đầu và tùy chọn -t để chỉ định thời lượng mã hóa, ví dụ từ 3 phút và 5 giây trong 45 giây:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Dấu thời gian cần phải ở định dạng HH: MM: SS.xxx hoặc tính bằng giây.

  • Nếu bạn không chỉ định tùy chọn -t, nó sẽ đi đến cuối.

Ví dụ làm việc:

  1. Tải xuống ffmpeg
  2. Mở Dấu nhắc lệnh (Bắt đầu> Chạy> CMD) hoặc trên Linux / Mac, mở Terminal
  3. cd vào thư mục với ffmeg.exe
  4. Đưa ra lệnh của bạn và đợi tệp đầu ra (hoặc khắc phục mọi lỗi)

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


3
Dưới đây là hướng dẫn cho các -q:agiá trị: trac.ffmpeg.org/wiki/Encode/MP3 Zero là cài đặt VBR chất lượng cao nhất, thường dẫn đến bitrate trung bình ở phần trên của dải CBR lành mạnh (trong đó 320 kbit / s là tối đa, có thể là một chút vượt quá điểm mà nén không mất mát trở nên phù hợp hơn).
Evgeni Sergeev

3
-map alàm gì?
Iulian Onofrei

Hãy cẩn thận: đây là mã hóa lại âm thanh với độ nén mất mát, sẽ làm giảm chất lượng một chút. Nếu bản gốc đã được nén, bạn sẽ giảm chất lượng hai lần, điều này có thể hoặc không thể nhận thấy.
Davidmh

Lệnh này hoạt động với tôi, khi lệnh trên -vnkhông.
Mmm

12

Dòng lệnh là chính xác và hoạt động trên một tệp video hợp lệ. Tôi chắc chắn rằng bạn đã cài đặt đúng thư viện để làm việc với mp3, cài đặt đầu dò khập khiễng với một codec âm thanh khác.

Thông thường

ffmpeg -formats

hoặc là

ffmpeg -codecs

sẽ cung cấp đầy đủ thông tin để bạn biết thêm.


11

ffmpeg -i sample.avisẽ cung cấp cho bạn thông tin định dạng âm thanh / video cho tệp của bạn. Đảm bảo rằng bạn có các thư viện thích hợp được cấu hình để phân tích luồng đầu vào. Ngoài ra, hãy chắc chắn rằng tập tin không bị hỏng.


bây giờ, tôi đã nhận kết quả chính xác khi tôi đã cố gắng nhận xét tương tự với một mkv vedio.why nó không phải đang làm việc cho .avi, là có bất kỳ lệnh ffmpeg để chuyển đổi .avi
user1269669

1
AVI hoặc MKV đề cập đến định dạng chứa có thể chứa nhiều định dạng âm thanh / video khác nhau. Bạn không muốn chuyển đổi âm thanh AVI, bạn đang tìm cách chuyển đổi đoạn âm thanh trong tệp AVI mà bạn chưa chỉ định. Sử dụng lệnh tôi liệt kê ở trên để xem loại âm thanh nào trong tệp AVI. Nếu là MP3, bạn cần biên dịch FFMPEG với thư viện MP3 như LAME lame.sourceforge.net
smp

6

Để mã hóa âm thanh mp3 ffmpeg.org hiển thị ví dụ sau:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Tôi đã trích xuất âm thanh từ một video chỉ bằng cách thay thế input.wavbằng tên tệp video. Có 2nghĩa là 190 kb / giây. Bạn có thể thấy các mức chất lượng khác tại liên kết của tôi ở trên.


Ví dụ đó là để chuyển đổi một tệp âm thanh sang định dạng khác, không phải để trích xuất nó từ video.
Iulian Onofrei

@IulianOnofrei, như tôi đã mô tả trong câu trả lời của mình, bạn có thể thay thế tệp âm thanh bằng tệp video. Nó làm việc cho tôi.
Suragch

6

Đây là những gì tôi vừa sử dụng:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Tùy chọn giải thích:

  • my.mkv là một tệp video nguồn, bạn cũng có thể sử dụng các định dạng khác
  • -map 0:3có nghĩa là tôi muốn luồng thứ 3 từ tệp video. Đặt N của bạn ở đó - các tệp video thường có nhiều luồng âm thanh; bạn có thể bỏ qua nó hoặc sử dụng -map 0:ađể lấy luồng âm thanh mặc định. Chạyffprobe my.mkv để xem những gì các tập tin video có.
  • my.mp3 là tên tệp âm thanh đích và ffmpeg chỉ ra tôi muốn có MP3 từ phần mở rộng của nó. Trong trường hợp của tôi, luồng âm thanh nguồn là ac3 DTS và chỉ sao chép không phải là thứ tôi muốn
  • 320k là bitrate mục tiêu mong muốn
  • -vn có nghĩa là tôi không muốn video trong tệp mục tiêu

2

Chỉ là một phỏng đoán:

-ab 192

nên là

-ab 192k

Có vẻ như đó có thể là một vấn đề, nhưng có lẽ ffmpeg đủ thông minh để sửa nó.


2
Nhận xét hợp lệ và tôi đã chỉnh sửa câu hỏi của OP để thay đổi nó, nhưng điều này không thay đổi bất cứ điều gì (nhiều nhất, điều này tạo ra một cảnh báo).
Jean-Philippe Pellet

2

Nếu âm thanh được bọc trong avi không phải là định dạng mp3 để bắt đầu, bạn có thể cần chỉ định -acodec mp3làm tham số bổ sung. Hoặc bất kể codec mp3 của bạn là gì (trên các hệ thống Linux có lẽ -acodec libmp3lame). Bạn cũng có thể có được hiệu ứng tương tự, không biết nền tảng, bằng cách thay vào đó chỉ định -f mp3"buộc" định dạng sang mp3, mặc dù không phải tất cả các phiên bản của ffmpeg vẫn hỗ trợ chuyển đổi đó. Mileage của bạn có thể khác nhau.


2

Để trích xuất mà không cần chuyển đổi, tôi sử dụng một mục trình đơn ngữ cảnh - như hành động tùy chỉnh của trình quản lý tệp trong Linux - để chạy phần sau (sau khi đã kiểm tra loại âm thanh mà video chứa; ví dụ cho video chứa oggâm thanh):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

được dựa trên lệnh ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Tôi đã sử dụng -map 0:1trong đó mà không gặp vấn đề gì, nhưng, như đã nói trong một nhận xét của @LordNeckbeard, "Luồng 0:1không được đảm bảo luôn luôn là âm thanh. Sử dụng -map 0:athay vì -map 0:1sẽ tránh sự mơ hồ."


1
Stream 0:1không được đảm bảo để luôn luôn là âm thanh. Sử dụng -map 0:athay vì -map 0:1sẽ tránh sự mơ hồ.
llogan

@LordNeckbeard ~ Tôi sẽ tính đến điều đó, cảm ơn.

Tôi đã sử dụng mediainfođể xác định bản nhạc âm thanh và chọn nó như thế này: -map 0:a:1trong đó a: 1 là chỉ số bản nhạc âm thanh thứ hai, thx! -c:a copylàm cho nó nhanh hơn nhiều
Sức mạnh Bảo Bình

1

Đối với những người tìm kiếm cách đơn giản hơn để trích xuất âm thanh từ tệp video trong khi vẫn giữ các tham số của tệp video gốc, bạn có thể sử dụng:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Ví dụ: đang chạy:

ffmpeg -i screencap.mov screencap.mp3

trích xuất một mp3tập tin âm thanh từ một movtập tin video.


Đơn giản và hiệu quả. Tại sao tất cả các giải pháp khác rất phức tạp? +1
Scott Bigss

1
Câu hỏi là, tại sao điều này có một phiếu bầu xóa?!
Iulian Onofrei

-1

Sử dụng -b:athay vì -abnhư -abđã lỗi thời bây giờ, cũng đảm bảo đường dẫn tệp đầu vào của bạn là chính xác.

Để trích xuất âm thanh từ video tôi đã sử dụng lệnh bên dưới và nó hoạt động tốt.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Đây,

  • -y - Ghi đè tập tin đầu ra mà không cần hỏi.
  • -i- FFmpeg đọc từ một số lượng tùy ý các tập tin đầu vào có thể được chỉ định bởi -itùy chọn
  • -vn - Vô hiệu hóa quay video
  • -ar - đặt tốc độ lấy mẫu cho các luồng âm thanh nếu được mã hóa
  • -ac - Đặt số lượng kênh âm thanh.
  • -b:a - Đặt bitrate âm thanh
  • -f - định dạng

Kiểm tra điều này cho dự án Android FFmpeg mẫu hoàn chỉnh của tôi trên GitHub.

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.