ffmpeg - Làm cách nào để sao chép | giải nén cài đặt mã hóa từ tệp phương tiện hiện có?


19

Tôi muốn có thể làm điều này nhiều lần bây giờ vì vậy tôi yêu cầu.

Nếu tôi có một video hiện có hoặc tập tin âm thanh, ffmpeg, mplayervà máy nghe nhạc phương tiện truyền thông khác có thể phát hiện ít nhất một số của nó "propreties" như container, codec và bitrate sử dụng, có lẽ chất lượng khác nhau và mã hóa cài đặt cụ thể, vv

Làm cách nào tôi có thể trích xuất các cài đặt này từ một tệp hiện có để sử dụng chúng (trực tiếp) để mã hóa với ffmpeg?

Ví dụ: tôi nhận được một mkvvideo được mã hóa x264với một số cài đặt và một avitệp không nén khác . Tôi muốn "sao chép" các cài đặt mã hóa được sử dụng trong tệp x264 mkv để chuyển mã avi với cùng các cài đặt.

Lưu ý: Tôi đang tìm kiếm một cách không bao gồm công việc của con người với việc "dịch" các cài đặt từ bộ giải mã sang bộ mã hóa. Sẽ ổn nếu tôi cần giải nén các cài đặt trước và lưu nó ở đâu đó nhưng tôi muốn có thể đơn giản cung cấp các tùy chọn đọc vào một dòng lệnh hoặc tệp cấu hình cài sẵn cho ffmpeg.


Vâng, bạn có thể có thể sắp xếp thông qua đầu ra của ffprobe(đặc biệt là với -show_streams-show_formattùy chọn) và sử dụng thông tin đó để kịch bản những thứ quan trọng
evilsoup

1
Thường sử dụng các cài đặt tương tự, chẳng hạn như bitrate (cố gắng sao chép bitrate chính xác dường như rất phổ biến đối với người dùng), sẽ không mang lại chất lượng tối ưu. Tất nhiên tôi không biết đầu vào thông thường của bạn là như thế nào, nhưng với việc sử dụng -crftùy chọn x264 thường được khuyến nghị. Xem Hướng dẫn mã hóa FFmpeg và x264 .
llogan

Tôi không thể tìm thấy bất cứ điều gì về cài đặt mã hóa trong đầu ra của ffprobe :(
thelolcat

Nó chỉ hiển thị số lượng ReFrames, nhưng không hiển thị các cài đặt khác như mediainfo hiện
thelolcat

Cú pháp đầu vào với ffmpeg khác với các trường siêu dữ liệu. ví dụ: bạn có thể đọc channels:6từ tệp video, nhưng để mã hóa nó, bạn cần sử dụng công tắc -ch:6. Một số thiết bị chuyển mạch sử dụng 1 chữ cái, một số sử dụng hai chữ cái, v.v.
jiggunjer

Câu trả lời:


10

Không có cách tự động để làm điều đó. Bạn phải xem các tham số của tệp gốc và áp dụng chúng cho tệp đầu ra.

Trong hầu hết các trường hợp, đây sẽ là như sau:

  • Định dạng chứa (MP4, MKV, Hoài)
  • Bộ giải mã video và âm thanh (H.264, H.265, Nhận)
  • Âm thanh cụ thể:
    • Số lượng kênh âm thanh
    • Tỷ lệ lấy mẫu âm thanh
    • Tốc độ âm thanh
  • Video cụ thể:
    • Hồ sơ và cấp độ (để đảm bảo khả năng tương thích, xem tại đây )
    • Giới hạn bitrate tối đa (ví dụ cho H.264 )
    • Độ phân giải video tối đa, thay đổi qua -filter:v scalehoặc-s:v
    • Framellow, thay đổi thông qua -filter:v fps -r
    • Lấy mẫu con Chroma, thay đổi qua -pix_fmt(ví dụ: -pix_fmt yuv420psẽ cung cấp cho bạn khả năng tương thích tốt nhất)
    • Kích thước GOP (khoảng cách giữa các khung IDR), được đặt qua -g
    • Cài đặt mã hóa cụ thể khác

Nhưng ngay cả khi bạn hiểu đúng, một số thiết bị có thể yêu cầu thông tin độc quyền, cụ thể được nhúng trong dòng bit.


Đối với các nhiệm vụ cụ thể của việc sử dụng x264, điều này sẽ không tầm thường. Tôi không biết về một tập lệnh duy nhất đảm nhiệm các tác vụ này, thường được thực hiện thủ công. Để có hầu hết thông tin về cài đặt mã hóa, trên Unix / Linux hoặc OS X, bạn có thể sử dụng mediainfovới một số thủ thuật Bash.

Ví dụ: đối với video được mã hóa x264 trong tệp MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Điều này sẽ xuất ra một danh sách các tùy chọn x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Sau đó, bạn có thể tự chuyển các tùy chọn này sang nhị phân x264.

Nếu bạn đi qua FFmpeg, điều đó phức tạp hơn một chút, vì không phải tất cả các tùy chọn của x264 đều có thể hoặc nên được ánh xạ như thế này. Lưu ý rằng thường là một đơn giản cài đặt trước, điều chỉnh và hồ sơ kỹ thuật sẽ làm mọi việc tốt (như đã thấy trong x264 --fullhelphướng dẫn mã hóa x264 ), và xác định mức độ CRF là đủ.

Và điều này thậm chí không xem xét âm thanh, may mắn thay, không có nhiều lựa chọn.


Vì vậy, nó không thể với ffprobe hoặc ffmpeg?
thelolcat

Không, không thể trực tiếp làm điều đó với ffprobe / ffmpeg. Trong trường hợp video được mã hóa x264, tôi sẽ sử dụng mediainfođầu ra và ánh xạ các tùy chọn này thành ffmpeg với -x264-params. (Xem thêm hướng dẫn mã hóa x264 ). Nhưng nếu bạn muốn một giải pháp chung cho tất cả các loại codec / bộ mã hóa hoặc định dạng chứa, thì bạn cần phải viết một tập lệnh tinh vi vừa phải thực hiện chuyển đổi.
slhck
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.