Có một số cách để loại bỏ AVI "không nén" ffmpeg
, nhưng tôi nghi ngờ bạn thực sự có nghĩa là "mất mát". Cả hai thuật ngữ đều có một chút công bằng của phòng ngọ nguậy trong định nghĩa của chúng, như bạn sẽ thấy.
Tôi sẽ kết thúc cuộc thảo luận này với phiên bản HD 720p của Big Buck Bunny , vì đây là video có sẵn miễn phí, tất cả chúng ta đều có thể thử nghiệm và nhận được kết quả mà chúng ta có thể so sánh. Tốc độ dữ liệu thô của video 1280 × 720p ở 24 khung hình / giây gần bằng với tốc độ 1024 × 768 đã nêu của bạn ở mục tiêu 29,97 khung hình / giây, vì vậy kết quả của tôi sẽ là một hướng dẫn khá tốt về tốc độ dữ liệu bạn có thể mong đợi trên đoạn phim của mình.
Danh sách tự động các tùy chọn có sẵn
Lệnh POSIX sau đây cung cấp cho bạn một danh sách hầu hết phù hợp với những gì chúng ta thảo luận dưới đây:
$ ffmpeg -codecs 2> /dev/null | grep '^..EV..S ' | grep -vE 'bitmap|image'
Bạn có thể muốn chạy lệnh đó trên máy của mình để xem bản dựng FFmpeg của bạn sẽ hỗ trợ gì. FFmpeg hiếm khi được xây dựng với mọi bộ mã hóa có thể được kích hoạt.
Bây giờ hãy thảo luận về các tùy chọn đó.
Hoàn toàn không nén
Nếu định nghĩa của bạn về "nén" là hình thức video là ở bên phải trước khi nó quay sang photon bởi một màn hình kỹ thuật số, gần nhất tôi nhìn thấy trong ffmpeg -codecs
danh sách là -c:v r210
, r10k
, v410
, v308
, ayuv
và v408
. Đây là tất cả đáng kể điều tương tự, chỉ khác nhau ở độ sâu màu , không gian màu , và alpha kênh hỗ trợ.
R210 và R10K là 4: 4: 4 RGB ở mức 10 bit cho mỗi thành phần (bpc), vì vậy cả hai đều yêu cầu khoảng 708 Mbit / s cho 720p trong thử nghiệm của tôi. (Đó là khoảng ⅓ TB mỗi giờ, các bạn!)
Các codec này đều đóng gói các thành phần màu 3 × 10 bit cho mỗi pixel thành giá trị 32 bit để dễ dàng thao tác bằng máy tính, giống như kích thước power-of-2. Sự khác biệt duy nhất giữa các codec này là phần cuối của từ 32 bit mà hai bit không sử dụng được bật. Sự khác biệt nhỏ này không nghi ngờ gì vì chúng đến từ các công ty cạnh tranh, Blackmagic Design và AJA Video Systems , tương ứng.
Mặc dù đây là những codec tầm thường, nhưng có lẽ bạn sẽ phải tải xuống codec Blackmagic và / hoặc AJA để phát các tệp bằng cách sử dụng chúng trên máy tính của bạn. Cả hai công ty này sẽ cho phép bạn tải về codec của họ mà không cần phải mua phần cứng của họ đầu tiên, kể từ khi họ biết bạn có thể đối phó với các tập tin được tạo ra bởi những khách hàng làm có một số phần cứng của họ.
V410 về cơ bản chỉ là phiên bản YUV của R210 / R10K; tốc độ dữ liệu của họ là giống hệt nhau. Tuy nhiên, codec này có thể mã hóa nhanh hơn, bởi vì ffmpeg
nhiều khả năng có đường dẫn chuyển đổi không gian màu được tăng tốc giữa không gian màu của khung hình đầu vào của bạn và không gian màu này.
Tuy nhiên, tôi không thể đề xuất codec này vì tôi không thể tải tệp kết quả để phát trong bất kỳ phần mềm nào tôi đã thử, ngay cả với các codec AJA và Blackmagic được cài đặt.
V308 là biến thể 8 bpc của V410, do đó, nó đạt đến 518 Mbit / s trong thử nghiệm của tôi. Như với V410, tôi không thể lấy các tệp này để phát lại trong phần mềm trình phát video thông thường.
AYUV và V408 về cơ bản giống như V308, ngoại trừ việc chúng bao gồm một kênh alpha, cho dù nó có cần thiết hay không! Nếu video của bạn không sử dụng độ trong suốt, điều này có nghĩa là bạn phải trả tiền phạt kích thước của các codec 10 bpc R210 / R10K ở trên mà không nhận được lợi ích của không gian màu sâu hơn.
AYUV có một ưu điểm: đó là codec "bản địa" trong Windows Media, vì vậy nó không yêu cầu phần mềm đặc biệt để chơi.
V408 được cho là có nguồn gốc từ QuickTime theo cùng một cách, nhưng tệp V408 sẽ không phát trong cả 7 hoặc 10 trên máy Mac của tôi.
Vì vậy, đặt tất cả những thứ này lại với nhau, nếu PNG của bạn được đặt tên frame0001.png
và vv:
$ ffmpeg -i frame%04d.png -c:v r10k output.mov
...or... -c:v r210 output.mov
...or... -c:v v410 output.mov
...or... -c:v v408 output.mov
...or... -c:v v308 output.mov
...or... -c:v ayuv output.avi
Lưu ý rằng tôi đã chỉ định AVI trong trường hợp của AYUV, vì nó gần như là một codec chỉ dành cho Windows. Những cái khác có thể hoạt động ở dạng QuickTime hoặc AVI, tùy thuộc vào loại codec nào trên máy của bạn. Nếu một định dạng chứa không hoạt động, hãy thử định dạng khác.
Các lệnh trên - cũng như các lệnh bên dưới - giả sử các khung đầu vào của bạn có cùng kích thước như bạn muốn cho video đầu ra của mình. Nếu không, thêm một cái gì đó như -s 1280x720
vào lệnh, trước tên tệp đầu ra.
RGB nén, nhưng cũng không mất mát
Nếu, như tôi nghi ngờ, bạn thực sự có nghĩa là "lossless" thay vì "không nén", một lựa chọn tốt hơn nhiều so với bất kỳ điều nào ở trên là Apple QuickTime Animation , thông qua-c:v qtrle
Tôi biết bạn nói rằng bạn muốn có AVI, nhưng thực tế là có lẽ bạn sẽ phải cài đặt codec trên máy Windows để đọc bất kỳ định dạng tệp dựa trên AVI nào được đề cập ở đây, trong khi với QuickTime thì có khả năng video ứng dụng bạn chọn đã biết cách mở tệp QuickTime Animation. (Bộ giải mã AYUV ở trên là ngoại lệ đơn độc mà tôi biết, nhưng tốc độ dữ liệu của nó rất cao, chỉ để nhận được lợi ích của AVI.)
ffmpeg
sẽ nhét qtrle
vào thùng chứa AVI cho bạn, nhưng kết quả có thể không tương thích rộng rãi. Trong thử nghiệm của tôi, QuickTime Player sẽ hiểu một chút về một tệp như vậy, nhưng sau đó nó sẽ phát nó. Mặc dù, điều kỳ lạ là VLC sẽ không chơi nó, mặc dù nó dựa một phần vào ffmpeg
. Tôi sẽ dính vào các thùng chứa QT cho codec này.
Bộ giải mã hình ảnh động sử dụng một sơ đồ RLE tầm thường , vì vậy đối với các hình ảnh động đơn giản, nó nên làm như Huffyuv bên dưới. Càng nhiều màu sắc trong mỗi khung hình, nó sẽ càng tiếp cận tốc độ bit của các tùy chọn không nén hoàn toàn ở trên. Trong thử nghiệm với Big Buck Bunny, tôi đã có thể ffmpeg
đưa cho tôi tệp 165 Mbit / s ở chế độ RGB 4: 4: 4, thông qua -pix_fmt rgb24
.
Mặc dù định dạng này được nén, nhưng nó sẽ cung cấp các giá trị pixel đầu ra giống hệt cho các tệp đầu vào PNG của bạn, vì lý do tương tự rằng nén không mất dữ liệu của PNG không ảnh hưởng đến các giá trị pixel.
Việc ffmpeg
triển khai QuickTime Animation cũng hỗ trợ -pix_fmt argb
, giúp bạn có được 4: 4: 4: 4 RGB, nghĩa là nó có kênh alpha. Theo một cách rất thô sơ, nó là tương đương với -c:v ayuv
, được đề cập ở trên. Tuy nhiên, do nén không mất dữ liệu, nó chỉ đạt 214 Mbit / s , ít hơn tốc độ dữ liệu của AYUV mà không mất chất lượng hoặc tính năng.
Có các biến thể của Animation Animation với ít hơn 24 bit cho mỗi pixel, nhưng chúng được sử dụng tốt nhất cho các kiểu hoạt hình đơn giản dần dần. ffmpeg
dường như chỉ hỗ trợ một trong các định dạng khác được xác định bởi thông số kỹ thuật -pix_fmt rgb555be
, có nghĩa là 15 bpp big endian RGB. Nó có thể chấp nhận được đối với một số video và phù hợp với hầu hết các cảnh quay screencast và hoạt hình đơn giản. Nếu bạn có thể chấp nhận số thập phân không gian màu, bạn có thể thấy tốc độ dữ liệu 122 Mbit / s của nó hấp dẫn.
Đặt tất cả những thứ này lại với nhau:
$ ffmpeg -i frame%04d.png -c:v qtrle -pix_fmt rgb24 output.mov
...or... -pix_fmt argb output.mov
...or... -pix_fmt rgb555be output.mov
Hiệu quả không mất mát: Thủ thuật YUV
Bây giờ, điều về RGB và YUV 4: 4: 4 là các mã hóa này rất dễ xử lý cho máy tính, nhưng chúng bỏ qua một thực tế về tầm nhìn của con người, đó là mắt chúng ta nhạy cảm hơn với sự khác biệt màu đen và màu trắng so với sự khác biệt màu sắc .
Do đó, hệ thống lưu trữ và phân phối video hầu như luôn sử dụng ít bit trên mỗi pixel cho thông tin màu hơn so với thông tin độ chói. Điều này được gọi là mẫu phụ sắc độ . Các lược đồ phổ biến nhất là 4: 2: 0 và 4: 2: 2.
Tốc độ dữ liệu của YUV 4: 2: 0 chỉ cao hơn 50% so với video không nén màu đen và trắng (chỉ có Y) và speed tốc độ dữ liệu của 4: 4: 4 RGB hoặc YUV.
4: 2: 2 là một loại điểm giữa 4: 2: 0 và 4: 4: 4. Nó gấp đôi tốc độ dữ liệu của video chỉ có Y và tốc độ dữ liệu là 4: 4: 4.
Đôi khi bạn cũng thấy 4: 1: 1, như trong tiêu chuẩn máy ảnh DV cũ . 4: 1: 1 có cùng tốc độ dữ liệu không nén như 4: 2: 0, nhưng thông tin màu được sắp xếp khác nhau.
Điểm chính của tất cả những điều này là nếu bạn bắt đầu với tệp H.264 4: 2: 0, hãy mã hóa lại thành RGB không nén 4: 4: 4, bạn hoàn toàn không mua gì YUV nén 4: 2: 0. Điều này đúng ngay cả khi bạn biết quy trình làm việc của mình là 4: 4: 4 RGB, vì đó là một chuyển đổi tầm thường; phần cứng và phần mềm video thực hiện chuyển đổi như vậy một cách thường xuyên.
Bạn thực sự chỉ cần 4: 4: 4 khi bạn nhìn trộm pixel hoặc bạn đang thực hiện thay đổi màu ở cấp độ pixel trên video và bạn cần giữ nguyên các giá trị pixel chính xác. Ví dụ, công việc hiệu ứng hình ảnh (VFX) dễ thực hiện hơn với định dạng pixel 4: 4: 4, vì vậy, các nhà VFX cao cấp thường sẵn sàng chịu đựng tốc độ dữ liệu cao hơn mà nó yêu cầu.
Hiệu quả không mất mát: Lựa chọn Codec
Khi bạn tự mở các codec YUV bằng cách khử màu, các tùy chọn của bạn cũng mở ra. ffmpeg
có nhiều codec không mất hiệu quả .
Huffyuv
Tùy chọn tương thích rộng rãi nhất là Huffyuv . Bạn nhận được điều này thông qua -c:v huffyuv
.
Bộ giải mã Windows Huffyuv ban đầu chỉ hỗ trợ hai định dạng pixel: RGB24 và YUV 4: 2: 2. (Trên thực tế, nó hỗ trợ hai hương vị của YUV 4: 2: 2, chỉ khác nhau theo thứ tự các byte trên đĩa.)
Các phiên bản cũ hơn của codec FFmpeg Huffyuv không bao gồm hỗ trợ RGB24, vì vậy nếu bạn dùng thử và FFmpeg cho bạn biết nó sẽ sử dụng yuv422p
định dạng pixel, bạn cần nâng cấp.
FFmpeg cũng có một codec biến thể Huffyuv có tên FFVHuff, hỗ trợ YUV 4: 2: 0. Biến thể này không tương thích với codec Windows DirectShow Huffyuv, nhưng nó sẽ mở trong mọi phần mềm dựa trên libavcodec
, chẳng hạn như VLC.
RGB24 - RGB 4: 4: 4 về cơ bản giống như tùy chọn không gian màu RGB24 của QuickTime Animation. Hai codec sẽ khác nhau một chút về nén cho một tệp nhất định, nhưng chúng thường sẽ đóng.
Về cơ bản, nó cũng giống như chế độ YUV 4: 4: 4 được sử dụng bởi tùy chọn V308 ở trên. Sự khác biệt về không gian màu làm cho không có sự khác biệt thực tế, vì việc chuyển đổi không gian màu rất dễ thực hiện trong thời gian thực.
Do khả năng nén không mất dữ liệu của Huffyuv, tôi đã có thể có được một video thử nghiệm để nén tới khoảng 251 Mbit / giây ở chế độ RGB24, với chất lượng hình ảnh giống hệt với những gì bạn nhận được từ V308 hoặc AYUV. Nếu AVI là điều bắt buộc đối với bạn, việc cài đặt codec Huffyuv có lẽ ít đau đớn hơn so với việc trả chi phí tốc độ dữ liệu 3 × của AYUV.
YUV 4: 2: 2 - Chế độ này thực tế hơn cho video so với RGB24, không nghi ngờ gì tại sao các ffmpeg
nhà phát triển lại chọn triển khai nó trước. Như bạn mong đợi từ mức giảm lý thuyết đã thảo luận ở trên, tệp thử nghiệm của tôi được mã hóa thành 173 Mbit / s . Điều đó khá chính xác, nếu bạn tính đến thực tế là đoạn âm thanh không thay đổi giữa hai bài kiểm tra này.
YUV 4: 2: 0 - Tùy chọn này xác định thông tin màu nhiều hơn 4: 2: 2, giảm tốc độ dữ liệu xuống 133 Mbit / s trong thử nghiệm của tôi.
Đặt tất cả những thứ này lại với nhau:
$ ffmpeg -i frame%04d.png -c:v huffyuv -pix_fmt rgb24 output.avi
...or... -pix_fmt yuv422p output.avi
...or... -c:v ffvhuff -pix_fmt yuv420p output.avi
Mặc dù ffvhuff
codec mặc định là 4: 2: 0 khi tôi viết điều này và thực sự chỉ hỗ trợ định dạng pixel đó trong phiên bản phát hành mà tôi đang sử dụng, điều này đang thay đổi , vì vậy bạn nên bao gồm cờ trong trường hợp thay đổi mặc định này.
Út Video
Một lựa chọn gần đây hơn với tinh thần tương tự như Huffyuv và FFVHuff là Ut Video . Giống như Huffyuv, có một codec video Windows , có nghĩa là bất kỳ chương trình Windows nào có thể phát phim đều có thể phát video bằng cách sử dụng codec này với codec được cài đặt. Không giống như Huffyuv, cũng có một codec video Mac, vì vậy bạn không bị hạn chế đối với phần mềm dựa trên FFmpeg hoặc libavcodec
để đọc các tệp này trên máy Mac.
Bộ giải mã này rất linh hoạt về các không gian màu, vì vậy tôi sẽ chỉ đưa ra một vài ví dụ về các không gian màu phổ biến:
4: 4: 4 RGB thông qua -f avi -c:v utvideo -pix_fmt rgb24
cung cấp cho 178 Mbit / giây đầu ra
4: 4: 4 YUV qua -f avi -c:v utvideo -pix_fmt yuv444p
cho 153 Mbit / giây đầu ra
4: 2: 2 YUV qua -f avi -c:v utvideo -pix_fmt yuv422p
cho 123 Mbit / giây đầu ra
4: 2: 0 YUV qua -f avi -c:v utvideo -pix_fmt yuv420p
cho 100 Mbit / giây đầu ra
Tôi nghi ngờ YUV 4: 4: 4 làm tốt hơn 4: 4: 4 RGB trong thử nghiệm này mặc dù hai cái này tương đương về mặt kỹ thuật vì video nguồn là 4: 2: 0 YUV, vì vậy việc sắp xếp dữ liệu theo định dạng YUV cho phép nén không mất dữ liệu tốt hơn bằng cách nhóm các kênh U và V dự phòng một phần lại với nhau trong tệp.
FFV1
Một tùy chọn thú vị khác trong không gian này là FFV1
codec riêng của FFmpeg . Phần lớn này được sử dụng như một codec lưu trữ thay vì codec phát lại hoặc chỉnh sửa, nhưng vì rất nhiều phần mềm dựa trên libavcodec
thư viện làm nền tảng cho FFmpeg hoặc có thể được sử dụng libavcodec
thông qua các công cụ như ffdshow
, dù sao nó cũng có thể hữu ích cho bạn.
Theo mặc định, ffmpeg
sẽ duy trì không gian màu của các tệp đầu vào của bạn khi sử dụng codec linh hoạt như FFV1, để nếu bạn cung cấp cho nó một trong các tệp MP4 Big Buck Bunny chính thức, sử dụng YUV 4: 2: 0, đó là những gì bạn sẽ nhận được trừ khi bạn đưa một -pix_fmt
lá cờ cho ffmpeg
. Điều này dẫn đến một tệp đầu ra 63 Mbit / s .
Nếu bạn buộc FFV1 sử dụng không gian màu YUV 4: 4: 4 -pix_fmt yuv444p
, kích thước tệp chỉ lên tới 86 Mbit / giây , nhưng trong trường hợp này, chúng tôi sẽ không mua gì cho chúng tôi vì chúng tôi mã hóa từ bản gốc 4: 2: 0 . Tuy nhiên, thay vào đó, nếu bạn cung cấp một bộ PNG, như trong câu hỏi ban đầu, tệp đầu ra có thể sử dụng không gian bgra
hoặc bgr0
màu, chỉ là sự sắp xếp lại các không gian argb
và rgb24
màu được đưa lên ở trên.
Mất dữ liệu H.264
Một lựa chọn thú vị khác là Lossless H.264 . Đây là khá nhiều một x264-chỉ điều như các văn bản này, nhưng những người sử dụng FFmpeg ở phía mã hóa có thể sẽ được sử dụng phần mềm khác bao gồm libx264
trên giải mã bên cũng vậy, chẳng hạn như VLC.
Cách đơn giản nhất để có được một tập tin như vậy là:
$ ffmpeg -i frame%04d.png -c:v libx264 -qp 0 -f mp4 output.mp4
Các -qp 0
lá cờ là chìa khóa: giá trị cao hơn cho nén lossy. (Bạn cũng có thể cung cấp -crf 0
để có được hiệu ứng tương tự.)
Như với FFV1, ffmpeg
sẽ cố gắng đoán không gian màu đầu ra tốt nhất được cung cấp không gian màu đầu vào, vì vậy để so sánh với kết quả ở trên, tôi đã chạy nhiều lượt mã hóa trên tệp nguồn Big Buck Bunny với các không gian màu khác nhau:
yuv444p : Đây là những gì bạn ffmpeg
chọn khi bạn cung cấp cho nó một luồng RGB PNG, như trong câu hỏi ban đầu và dẫn đến một tệp 44 Mbit / giây với tệp thử nghiệm của chúng tôi
yuv422p : Điều này tương tự như không gian màu mặc định cho Huffyuv, nhưng chúng tôi nhận được tệp 34 Mbit / giây trong trường hợp này, khá tiết kiệm!
yuv420p : Đây là mặc định cho các MP4 chính thức của Big Buck Bunny mà tôi đang thử nghiệm và cho kết quả là tệp 29 Mbit / giây .
Coi chừng bạn đang giao dịch rất nhiều khả năng tương thích để có được kích thước tệp nhỏ như vậy. Đó là lý do tại sao tôi thậm chí không buồn cố nhét cái này vào thùng chứa AVI hoặc MOV. Nó gắn chặt với x264 đến mức bạn cũng có thể sử dụng loại thùng chứa tiêu chuẩn (MP4) của nó thay thế. Bạn cũng có thể sử dụng một cái gì đó như Matroska cho việc này.
Bạn có thể đánh đổi một số tốc độ bit đó để có thời gian mã hóa nhanh hơn bằng cách thêm -preset ultrafast
. Điều đó đã tăng tốc độ bit của tệp thử nghiệm của tôi lên 44 Mbit / s ở chế độ YUV 4: 2: 2, nhưng được mã hóa nhanh hơn nhiều, như đã hứa. Các tài liệu cho rằng điều đó -preset veryslow
cũng đáng giá, nhưng nó dẫn đến thời gian mã hóa lâu hơn nhiều trong khi chỉ tiết kiệm được một chút dung lượng; Tôi không thể khuyên bạn nên nó.
Khác
ffmpeg
cũng hỗ trợ chế độ chỉ giải mã cho Lagarith và chế độ chỉ mã hóa cho JPEG lossless . Hai codec này thực sự hơi giống nhau và sẽ cho các tệp nhỏ hơn một chút so với Huffyuv với cùng chất lượng. Nếu các ffmpeg
nhà phát triển thêm mã hóa Lagarith, nó sẽ là một sự thay thế mạnh mẽ cho Huffyuv. Tuy nhiên, tôi không thể khuyên dùng JPEG lossless vì nó không được hỗ trợ giải mã rộng.
Mất cảm nhận: Hoặc, có lẽ bạn có thể thoát khỏi một số mất mát
Sau đó, có các codec bị mất cảm giác . Trừ khi bạn nhìn trộm pixel, bạn gần như chắc chắn không thể nói rằng những cái này cho kết quả hình ảnh khác với hai nhóm trước. Bằng cách từ bỏ ý tưởng thay đổi hoàn toàn bằng không giữa cảm biến quay video và thiết bị hiển thị, bạn mua được khoản tiết kiệm đáng kể:
Apple ProRes :-c:v prores
hoặc-c:v prores_ks
- ProRes là một codec dựa trên hồ sơ, có nghĩa là có một số biến thể, mỗi biến thể có chất lượng khác nhau so với đánh đổi không gian:
ProRes 4444 mã hóa video thử nghiệm của chúng tôi chỉ bằng 114 Mbit / s , nhưng chất lượng VFX . Hiện tại có baprores*
codeckhác nhautrong FFmpeg, nhưng chỉprores_ks
hỗ trợ ProRes 4444, khi tôi viết điều này, thông qua-profile:v 4444
tùy chọn.
Nếu bạn đang tự hỏi tại sao bạn lại bận tâm với ProRes 4444 trên Lossless H.264, thì đó là khả năng tương thích, tốc độ giải mã, khả năng dự đoán và kênh alpha.
ProRes 422 tiết kiệm nhiều không gian hơn, chỉ cần 84 Mbit / s để đưa ra kết quả mà bạn có thể biết từ ProRes 4444 chỉ bằng cách nhìn trộm pixel. Trừ khi bạn cần kênh alpha được cung cấp bởi ProRes 4444, có lẽ không có lý do gì để nhấn mạnh vào ProRes 4444.
ProRes 422 là đối thủ cạnh tranh gần hơn với tùy chọn Lossless H.264 ở trên, vì không hỗ trợ kênh alpha. Bạn sẽ muốn chấp nhận tốc độ bit cao hơn của ProRes nếu bạn cần khả năng tương thích với các ứng dụng video chuyên nghiệp của Apple, chi phí CPU thấp hơn để mã hóa và giải mã hoặc tốc độ bit có thể dự đoán được. Cái sau là quan trọng với các bộ mã hóa phần cứng, ví dụ. Mặt khác, nếu bạn có thể đối phó với các vấn đề tương thích của Lossless H.264, bạn có tùy chọn sử dụng không gian màu 4: 2: 0, đây không phải là một tùy chọn từ bất kỳ cấu hình ProRes nào.
Tất cả ba bộ mã hóa ProRes trong FFmpeg đều hỗ trợ cấu hình ProRes 422, vì vậy tùy chọn đơn giản nhất là sử dụng -c:v prores
, thay vì -c:v prores_ks -profile hq
, hoặc phụ thuộc vào tính năng tự động cấu hình prores_ks
để thực hiện đúng.
Thậm chí còn có các cấu hình ProRes tuyệt vời hơn, nhưng chúng có nghĩa là cho video SD hoặc dưới dạng proxy cho các tệp độ phân giải đầy đủ.
Vấn đề chính với ProRes là nó chưa có sự hỗ trợ rộng rãi ngoài thế giới video của Apple và pro.
DNxHD của Avid là một codec tương tự như ProRes, nhưng không gắn liền với thế giới video chuyên nghiệp của Apple. Avid cung cấp các codec có thể tải xuống miễn phí cho cả Windows và Macintosh và FFmpeg hiện hỗ trợ nó thông qua-c:v dnxhd
.
Vì DNxHD là một codec dựa trên cấu hình như ProRes, bạn chọn cấu hình từ bộ được xác định trước và thông báo cho codec biết kích thước khung hình, tốc độ khung hình và tốc độ bit sẽ sử dụng. Đối với tệp thử nghiệm Big Buck Bunny, -b:v 60M
hồ sơ là phù hợp nhất. Không có gì đáng ngạc nhiên, tệp kết quả là khoảng 59 Mbit / s .
MJPEG tổn thất thấp :-vcodec mjpeg -qscale:v 1
- Điều này phổ biến hơn nhiều so với JPEG lossless. Trên thực tế, đây từng là một codec chỉnh sửa video khá phổ biến và nó vẫn thường được sử dụng bởi những thứ như máy quay video phát trực tuyến. Tất cả lịch sử đó có nghĩa là rất dễ tìm thấy phần mềm hỗ trợ nó.
Mong đợi sự thay đổi khá rộng về tốc độ dữ liệu từ codec này. Một thử nghiệm tôi vừa thực hiện ở đây đã cho tôi 25 Mbit / s cho video 720p. Đó là mức nén đủ cao để khiến tôi lo lắng về sự mất mát, nhưng nó có vẻ khá tốt với tôi. Chỉ dựa trên tốc độ dữ liệu, tôi có thể nói rằng nó có thể ngang tầm với 12 Mbit / s MPEG-2 hoặc 6 Mbit / s H.264.
Đặt tất cả những thứ này lại với nhau:
$ ffmpeg -i frame%04d.png -c:v prores_ks -profile:v 4444 output.mov
...or... -c:v prores_ks -profile:v hq output.mov
...or... -c:v prores output.mov
...or... -c:v dnxhd -b:v 60M output.mov
...or... -c:v mjpeg -qscale:v 1 output.avi
Điểm mấu chốt của các phương pháp này là trừ khi bạn làm một việc gì đó rất khắt khe, "đủ tốt" thực sự là đủ tốt.
Chú thích và lạc đề
Lệnh sẽ hoạt động như được đưa ra trên Linux, macOS, BSD và Unix. Nếu bạn đang ở trên Windows, bạn có thể nhận được dòng lệnh POSIX thông qua Cygwin hoặc WSL .
Có một số lý do tại sao danh sách được tạo bởi lệnh đó không hoàn toàn khớp với bộ codec tôi đã chọn để thảo luận ở trên:
Thứ hai grep
là để lọc các bộ mã hóa không phù hợp như bmp
không phải là codec "video", mặc dù được gắn thẻ V
trong danh sách này. Mặc dù về mặt kỹ thuật, bạn có thể nhét nhiều thứ này vào một thùng chứa như AVI, MP4 hoặc MKV để có được một video một tệp, nhưng tệp đó sẽ không thể đọc được bởi bất cứ thứ gì ngoại trừ một chương trình dựa trên ffmpeg
hoặc libavcodec
.
Có một vài trường hợp ngoại lệ, chẳng hạn như điều đó -f avi -c:v ljpeg
mang lại thứ mà bạn có thể gọi là "lossless MJPEG", nhưng theo quy định, chúng tôi không quan tâm đến việc nhét nhiều tệp hình ảnh tĩnh vào thùng chứa A / V ở đây để làm phim. Chúng tôi muốn các codec video được công nhận rộng rãi ở đây, không phải là mánh khóe ngữ nghĩa.
Lệnh hiện không thể lọc ra một số bộ mã hóa không phù hợp như GIF vì chúng hiện không được mô tả trong ffmpeg -codecs
đầu ra dưới dạng bitmap
hoặc image
định dạng tệp.
GIF là một trường hợp thú vị: nó hỗ trợ nhiều khung hình ảnh trong một tệp GIF với thông tin thời gian để phát lại chuyển động, nhưng vì nhiều lý do, nó hoàn toàn không phù hợp với cuộc thảo luận của chúng tôi ở đây.
Một vài trong số các tùy chọn được hiển thị là đã lỗi thời hoặc không bao giờ thực sự có nhiều lực kéo, chẳng hạn như flashsv
, dirac
và snow
, do đó, nó không đáng thảo luận chúng ở trên.
Một số tùy chọn trong danh sách đó có nghĩa là chỉ để sử dụng trong đường ống giữa ffmpeg
trường hoặc giữa ffmpeg
và một chương trình khác, chẳng hạn như rawvideo
và wrapped_avframe
, và do đó không phù hợp với mục đích của chúng tôi ở đây.
Gần cuối cuộc thảo luận ở trên, tôi thận trọng mở rộng phạm vi câu hỏi một chút để bao gồm một vài tùy chọn mất mát được lựa chọn cẩn thận, vì vậy chúng không vượt qua grep
bộ lọc đầu tiên trong lệnh trên.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.