Một số định nghĩa chính:
- Một codec (ví dụ, H.264, HEVC, VP9) chỉ chịu trách nhiệm cho phần video hoặc âm thanh và một hoặc nhiều codec có thể được hợp nhất vào một thùng chứa.
- Một thùng chứa (ví dụ, MP4, MKV) có trách nhiệm giữ chúng lại với nhau và đây cũng là thứ bạn thường mở trong trình phát đa phương tiện của mình.
- Một bộ mã hóa cụ thể (ví dụ: x264, libvpx) chịu trách nhiệm biến luồng đầu vào thành dòng bit tuân thủ codec. Thường có nhiều bộ mã hóa cho một codec cụ thể.
Như bạn có thể thấy, chúng ta sẽ phải giải thích một vài điều ở đây.
Codec là gì?
Một codec là viết tắt của bộ mã hóa / giải mã, về cơ bản chỉ có nghĩa như sau: Dữ liệu được tạo bởi bộ mã hóa luôn có thể được giải mã bởi một bộ giải mã thích hợp. Điều này xảy ra là hợp lệ cho video, âm thanh, nhưng bạn cũng có thể nghĩ về mật mã (một bộ mã hóa cần một bộ giải mã thích hợp để hiển thị một tin nhắn được mã hóa).
Ngày nay, khi một codec video được chỉ định, các tổ chức tham gia vào nó thường chỉ xác định cú pháp của tiêu chuẩn. Ví dụ, họ sẽ nói: "Định dạng dòng bit phải như thế này", "Ở 0x810429AAB
đây sẽ được dịch sang đó", v.v. Thông thường họ cung cấp một bộ mã hóa và giải mã tham chiếu, nhưng sau đó một bộ mã hóa được viết như thế nào để khớp với như vậy định dạng hoàn toàn là tùy thuộc vào nhà sản xuất.
Đây là lý do tại sao bạn sẽ tìm thấy rất nhiều bộ mã hóa cho cùng một codec, và một số trong số chúng thậm chí là thương mại.
Một ví dụ điển hình - H.264
Trước khi chúng ta trộn lẫn thuật ngữ, hãy lấy một ví dụ. Hãy xem xét trường hợp cho H.264 . Tên của chuẩn là H.264 - đó không phải là tên của bộ mã hóa thực tế. Mainconcept là một bộ mã hóa thương mại rất tốt, trong khi x264 là một mã nguồn mở và miễn phí. Cả hai yêu cầu để cung cấp chất lượng tốt, tất nhiên.
Thực tế là bạn có thể tối ưu hóa mã hóa tạo nên sự cạnh tranh ở đây. Cả hai bộ mã hóa sẽ cung cấp một dòng bit được tiêu chuẩn hóa mà luôn có thể được giải mã bằng bộ giải mã tương thích H.264.
Tóm tắt
Vì vậy, tất cả trong tất cả, hãy nói rằng một bộ mã hóa sẽ:
- lấy khung hình video
- tạo ra một dòng bit hợp lệ
Dòng bit sau đó được ghép vào một thùng chứa.
Bộ giải mã sẽ:
- lấy dòng bit hợp lệ đó
- xây dựng lại các khung hình video từ nó
Cả hai đều phù hợp với một tiêu chuẩn codec. Đó là tất cả!
Codec hiện tại
Những ngày này, có lẽ bạn sẽ chỉ tìm thấy các video được mã hóa bằng các codec tôi sẽ đề cập dưới đây. Điều thú vị là hầu hết tất cả chúng đều được tạo bởi Nhóm chuyên gia hình ảnh chuyển động (MPEG). Nhưng cũng có một số loại tiền mã hóa miễn phí bản quyền khác, ví dụ như các loại được tạo bởi Google hoặc Liên minh cho phương tiện mở, là đối thủ cạnh tranh của các tiêu chuẩn MPEG.
Lưu ý rằng "MPEG" có thể đề cập đến cả codec và container, như bạn sẽ thấy bên dưới. Điều này làm tăng thêm sự nhầm lẫn, nhưng chỉ biết rằng "MPEG" không có nghĩa gì cả, ví dụ: "Tôi có một tệp ở định dạng MPEG" rất mơ hồ ".
MPEG-2 khá cũ. Bản phát hành công khai đầu tiên của nó là từ năm 1996. Video MPEG-2 chủ yếu được sử dụng cho phát sóng DVD và TV, ví dụ DVB-T hoặc vệ tinh và các ứng dụng cũ trong đó khả năng tương thích là quan trọng. Các video MPEG-2 hầu hết được tìm thấy trong một thùng chứa .MPG .
Đây có lẽ là cái được sử dụng chủ yếu để mã hóa video cho web vào giữa những năm 2000, nhưng nó đã được thay thế trong thời gian đó. Nó cung cấp chất lượng tốt ở kích thước tệp thực tế, điều đó có nghĩa là bạn có thể ghi toàn bộ phim có thời lượng 90 phút vào CD 600 MB (trong khi với MPEG-2, bạn sẽ cần DVD, xem câu trả lời của tôi ở đây ). Nó không hoạt động tốt cho nội dung HD hoặc 4K nữa.
Một số bộ mã hóa xuất video MPEG-4 Phần 2 là DivX , XviD có nguồn gốc mở của nó và Nero Digital .
Các video MPEG-4 Phần 2 hầu hết đều có trong một thùng chứa AVI , nhưng MP4 cũng được nhìn thấy thường xuyên.
Điều này còn được gọi là Mã hóa video nâng cao MPEG-4 (AVC) hoặc H.264 ; nó là codec được sử dụng nhiều nhất hiện nay Nó cung cấp chất lượng tốt ở kích thước tệp nhỏ và do đó hoàn toàn phù hợp cho tất cả các loại video cho Internet hoặc thiết bị di động. Bạn sẽ tìm thấy H.264 trong hầu hết mọi ứng dụng hiện đại, từ điện thoại đến máy quay phim. Trên các đĩa Blu-ray, video hiện được mã hóa thành H.264.
Một số bộ mã hóa cho nó là: x264 , NVENC (từ NVIDIA), Mainconcept . Các video chủ yếu có trong các thùng chứa MP4 , MKV hoặc MOV .
Còn được gọi là MPEG-H Phần 2, đây là sự kế thừa của MPEG-4 Phần 10 / AVC / H.264. Nó nhắm đến độ phân giải cao hơn (lên tới 8K ) và có thể cung cấp hiệu suất mã hóa cao hơn tới 50% (về chất lượng so với bitrate) so với H.264 ( ví dụ, xem bài viết này ).
Tiêu chuẩn được công bố vào năm 2013, và dần dần, codec bắt đầu được sử dụng ngày càng nhiều, ví dụ, đối với IPTV hoặc truyền video trực tuyến. HEVC cũng được Apple sử dụng để lưu trữ video và hình ảnh (sử dụng HEIF ) trên iOS. Tuy nhiên, thực tế là có nhiều nhóm bằng sáng chế liên quan đến HEVC có nhiều công ty (gần như tất cả trừ Apple) chuyển sang các lựa chọn thay thế miễn phí bản quyền. HEVC cũng không được hỗ trợ bởi tất cả các trình duyệt, khiến nó không thể sử dụng để phát trực tuyến web.
Bộ mã hóa nổi tiếng nhất là x265 . Ngoài ra còn có NVENC . Các video thường có trong các thùng chứa MP4 .
VP9 (sự kế thừa của VP8) là một codec chủ yếu được phát triển bởi Google. Nó là mở và miễn phí bản quyền, và được thực hiện trong nhiều trình duyệt . Chất lượng của nó gần như tốt như HEVC, và đôi khi còn tốt hơn (xem bài viết này của Netflix). VP9 là những gì bạn nhận được khi xem YouTube trên trình duyệt hỗ trợ nó.
VP9 có thể được mã hóa bằng bộ mã hóa libvpx và nó thường có trong các thùng chứa WebM hoặc MKV .
Một số công ty đã cùng nhau tạo thành một đối thủ cạnh tranh mạnh mẽ hơn với HEVC - nhưng như một sự thay thế miễn phí bản quyền. AV1 sẽ là sự kế thừa của VP9, và nó dựa trên những gì được cho là trở thành VP10. Nó được hỗ trợ bởi Liên minh Truyền thông mở (được thành lập bởi Amazon, Cisco, Google, Intel, Microsoft, Mozilla và Netflix). Đọc thêm về nó ở đây .
Bộ mã hóa libaom có thể được sử dụng để tạo dòng bit AV1, nhưng nó vẫn đang thử nghiệm.
Một định dạng (container) là gì?
Cho đến bây giờ chúng tôi chỉ giải thích "dòng bit" thô, về cơ bản chỉ là dữ liệu video thực sự thô. Bạn thực sự có thể tiếp tục và xem video bằng cách sử dụng một dòng bit thô như vậy. Nhưng trong hầu hết các trường hợp đó là không đủ hoặc không thực tế.
Do đó, bạn cần phải bọc video trong một container. Có nhiều lý do tại sao:
- Có thể bạn muốn một số âm thanh cùng với video
- Có thể bạn muốn bỏ qua một phần nào đó trong video (như, "chuyển đến 1: 32: 20.12")
- Cả âm thanh và video phải được đồng bộ hóa hoàn hảo
- Video có thể cần được truyền qua một mạng đáng tin cậy và chia thành các gói trước khi
- Video thậm chí có thể được gửi qua một mạng bị mất (như 3G) và chia thành các gói trước đó
Vì tất cả những lý do đó, các định dạng container được phát minh, một số đơn giản, một số nâng cao hơn. Tất cả những gì họ làm là "bọc" dòng bit video vào dòng bit khác.
Một thùng chứa sẽ đồng bộ hóa các khung hình video và âm thanh theo Dấu thời gian trình bày (PTS) của chúng, đảm bảo chúng được hiển thị cùng một lúc. Nó cũng sẽ đảm nhiệm việc thêm thông tin cho các máy chủ phát trực tuyến, nếu cần thiết, để một máy chủ phát trực tuyến biết khi nào nên gửi phần nào của tệp.
Chúng ta hãy xem một số container phổ biến.
Container phổ biến
Bạn sẽ tìm thấy các video chủ yếu được bọc trong các thùng chứa sau đây. Cũng có những cái khác ít phổ biến hơn, nhưng như tôi đã nói, hầu hết, đó là:
Audio Video Interleave - đây là bộ chứa cơ bản nhất, nó chỉ ở đó để xen kẽ âm thanh và video. Nó được viết vào năm 1992 và vẫn còn được sử dụng cho đến ngày nay, nhưng được coi là di sản, vì vậy đừng sử dụng nó nữa.
còn được gọi là MPEG-4 Phần 14 và dựa trên định dạng tệp QuickTime. Đây là định dạng chuyển sang cho video H.264, nhưng nó cũng bao bọc HEVC, MPEG-4 Phần 2 và MPEG-2.
Container này cũng có thể chỉ bao gồm âm thanh, đó là lý do tại sao bạn sẽ tìm thấy rất nhiều tệp .mp4 không có video mà là âm thanh được mã hóa AAC , cũng trong các tệp .m4a (chỉ là một phần mở rộng khác nhau). Phần mở rộng .m4v thường được lấy cho các luồng video.
Matroska Video (MKV) là một định dạng tệp mở và miễn phí thường được tìm thấy ngày nay, vì nó hỗ trợ về cơ bản bất kỳ codec nào, từ H.264 đến VP9, và tất nhiên cũng có nhiều codec âm thanh.
WebM dựa trên MKV và chủ yếu được sử dụng cho video VP9 và âm thanh Opus - nó là nơi chứa sự lựa chọn cho video phát trực tuyến web khi các codec này được sử dụng.
Bộ chứa Ogg là bộ chứa lựa chọn cho bộ giải mã video Theora (và bộ giải mã âm thanh Vorbis ), cũng được tạo bởi Quỹ Xiph.Org. Nó cũng miễn phí và là nguồn mở (giống như codec).
Định dạng video Flash được tạo bởi Adobe, để sử dụng trong các ứng dụng phát trực tuyến của họ. Nó không còn được sử dụng nhiều nữa, vì cách truyền phát được thực hiện đã thay đổi đáng kể trong những năm qua.
Codec và định dạng phổ biến
Ngoài ra, cái nào sau đây là codec, cái nào là định dạng tệp và cái nào không?
- Quicktime MOV : .mov là phần mở rộng tệp cho Định dạng tệp QuickTime , là một thùng chứa được tạo bởi Apple. Container này sau đó đã được điều chỉnh cho MP4. Nó có thể mang tất cả các loại tiền mã hóa. Quicktime thực sự là một khung phương tiện truyền thông hoàn toàn, nó không thực sự chỉ định bất kỳ codec nào theo như tôi quan tâm.
- MPEG (1, 2, 3, 4) : Các tiêu chuẩn được xác định bởi Nhóm chuyên gia hình ảnh chuyển động. Xem bài viết của tôi ở trên để biết chi tiết.
- WMV : Video truyền thông Windows. Đây thực sự là một codec được chứa trong bộ chứa Định dạng Hệ thống Nâng cao , sử dụng lại phần mở rộng .wmv . Lạ, nhưng đó là như vậy.
- FFmpeg : Đây không phải là codec hay container. Nó là một thư viện các công cụ video cũng cho phép chuyển đổi giữa các codec và container khác nhau. FFmpeg dựa vào nguồn mở
libavcodec
và libavformat
các thư viện để tạo codec và container tương ứng. Hầu hết các công cụ video bạn tìm thấy ngày nay đều dựa trên nó.
- AVC : Đồng nghĩa với MPEG-4 Phần 10 hoặc H.264.
- DivX : Một loại bộ mã hóa khác cho video MPEG-4 Phần 2.
- Xvid : Một loại bộ mã hóa cho video MPEG-4 Phần 2. Nó chỉ là mã nguồn mở, phiên bản miễn phí của DivX, tất nhiên đã dẫn đến một số tranh cãi.
- H.264 : Đồng nghĩa với MPEG-4 Phần 10 hoặc AVC.
Còn một chú ý đáng nói:
Tôi thậm chí có sử dụng thuật ngữ chính xác?
Tôi đoán một lần sẽ thích sử dụng cụ thể "codec" và "container" thay vì "format" để tránh hiểu lầm. Một định dạng về mặt lý thuyết có thể là bất cứ điều gì, bởi vì cả codec và container đều chỉ định một định dạng (tức là cách dữ liệu nên được biểu diễn).
Điều đó đang được nói, thuật ngữ FFmpeg sẽ sử dụng "định dạng" cho container. Điều này cũng là do sự khác biệt giữa:
libavcodec
, thư viện mã hóa / giải mã
libavformat
, thư viện cho các container