Các phương pháp hay nhất để chia sẻ video

Nhiều người chia sẻ video bằng thiết bị Android. Chất lượng của video nhận được thường kém hơn video gốc vì quá trình xử lý mà ứng dụng chia sẻ thực hiện. Tài liệu này mô tả cách tối ưu hoá chất lượng của video được chia sẻ và một số lỗi thường gặp khi xử lý video cần tránh. Để tối ưu hoá việc chia sẻ nội dung video HDR, hãy xem phần Sử dụng mô-đun Transformer để chuyển mã HDR thành SDR trên trang này.

Điều chính cần làm là duy trì độ phân giải không đổi và giữ chất lượng video cao nhất có thể trong thời gian dài nhất có thể trong khi chuẩn bị chia sẻ video.

Quy trình chia sẻ

Hình 1 minh hoạ một quy trình chia sẻ video thông thường:

Chia sẻ quy trình video Hình 1. Quy trình chia sẻ video.

Quy trình này bao gồm các bước sau:

  1. Quay và mã hoá video, có thể thêm hiệu ứng trong khi quay. Ngoài ra, người dùng có thể bỏ qua bước này và chọn một video trong bộ nhớ đã được quay trước từ một ứng dụng khác.
  2. Chỉnh sửa, lọc, chỉnh sửa hoặc xử lý video.
  3. Điều chỉnh tỷ lệ hoặc đổi kích thước video để chuẩn bị chuyển mã.
  4. Chuyển mã video để chia sẻ. Bộ lọc ở bước 2 thường được áp dụng như một phần của bước này.

Có hai bước trong quy trình mà bạn có cơ hội thiết lập các tham số xác định chất lượng video của mình: mã hoá trong quá trình quay video ban đầu và chuyển mã trước khi chia sẻ. Ngoài ra, bạn có thể cần phải điều chỉnh tỷ lệ video trước bước chuyển mã cuối cùng. Điều này cũng có thể ảnh hưởng đến chất lượng.

Đề xuất

Bảng 1 cho thấy 5 tham số chính về chất lượng video và cho biết những bước nào có thể sử dụng các tham số đó.

Tham số Quay hình Chia sẻ
Hồ sơ Y Y
Độ phân giải Y Y
Tốc độ bit Y Y
Thông số lượng tử hoá (QP) (hiếm khi) Y
Khung B N Y

Bảng 1. Những thông số chính quyết định chất lượng video

Hồ sơ

Để có kết quả tốt hơn, hãy sử dụng các cấu hình nâng cao hơn do bộ mã hoá và giải mã cụ thể cung cấp. Để mã hoá AVC, hãy chọn Cấu hình cao và cấp 4.

Độ phân giải, cắt và điều chỉnh theo tỷ lệ

Bạn có thể thay đổi độ phân giải ban đầu của video đã quay trong bước chuyển tỷ lệ trước khi chuyển mã để chia sẻ. Tuy nhiên, việc chuyển tỷ lệ có thể làm giảm chất lượng của video. Bạn nên tránh việc điều chỉnh theo tỷ lệ và chọn độ phân giải cho phương thức mã hoá ban đầu mà bạn có thể sử dụng trong suốt quy trình. Ngoài ra, hãy nhớ rằng việc cắt quá nhiều sẽ dẫn đến hình ảnh có chất lượng thấp, đặc biệt là khi bạn tăng độ phân giải của hình ảnh bị cắt. Hãy làm theo các nguyên tắc sau:

  • Chọn độ phân giải ít nhất bằng độ phân giải chia sẻ cuối cùng.
  • Độ phân giải chụp không được vượt quá độ phân giải chia sẻ, trừ phi tất cả các bước trung gian đều được thiết kế để hỗ trợ độ phân giải lớn hơn (chẳng hạn như tốc độ bit cao hơn trong quá trình chụp ban đầu).

    • Nếu chế độ mã hoá chia sẻ tạo ra độ phân giải 720x1280, bạn nên sử dụng độ phân giải ảnh là 720x1280.
    • Nếu bước trung gian giữa thao tác chụp và chia sẻ bao gồm cả việc cắt ảnh, hãy sử dụng độ phân giải ảnh cao hơn (chẳng hạn như 1080x1920) và tăng tốc độ bit chụp để xử lý các pixel thừa.
  • Việc cắt quá nhiều sẽ dẫn đến hình ảnh có chất lượng thấp, đặc biệt là khi hình ảnh bị cắt được tăng cường.

  • Tránh nâng cấp độ phân giải từ độ phân giải thấp hơn lên độ phân giải cao hơn. Việc tăng quy mô sẽ cố gắng tạo ra những chi tiết không có sẵn. Mang theo độ phân giải cao hơn mong muốn ngay từ đầu.

  • Nếu bạn phải nâng cấp, hãy điều chỉnh các thông số mã hoá. Ví dụ: nếu độ phân giải đã nâng cấp có số pixel nhiều hơn gấp đôi, hãy tăng gấp đôi tốc độ bit.

Độ phân giải và tốc độ bit có quan hệ với nhau. Ví dụ: việc chuyển video có độ phân giải cao qua một quy trình chia sẻ mà sau cùng sẽ chuyển mã thành tốc độ bit thấp sẽ tạo ra hình ảnh có chất lượng thấp hơn so với bắt đầu với độ phân giải thấp hơn. Khi tốc độ bit giảm, có các điểm giao thoa mà tại đó độ phân giải nhỏ hơn bắt đầu mang lại kết quả tốt hơn:

Tốc độ bit Độ phân giải
5 Mb/giây trở lên 1080x1920
1,5 – 5 Mb/giây trở lên 720x1280
1,5 Mb/giây trở xuống Tương đương với chuẩn SD. Cùng một số lượng pixel trong tỷ lệ khung hình 9:16 là khoảng 416x736

Bảng 2. Tốc độ bit so với độ phân giải

Nhiều ứng dụng phổ biến chia sẻ video ở độ phân giải 720p trở xuống. Dữ liệu cho thấy độ phân giải 720p là lựa chọn phù hợp cho mục tiêu tốc độ bit từ 1,5 đến 5 Mb/giây.

Tốc độ bit

Đang ghi

Việc sử dụng tốc độ bit mã hoá cao hơn mang lại sự cải thiện lớn nhất về chất lượng video. Bạn nên chọn tốc độ bit phù hợp với ứng dụng máy ảnh gốc. Đối với độ phân giải 720x1280, bạn nên sử dụng tốc độ bit chụp là 10 Mb/giây.

Vì quá trình mã hoá hoạt động thu thập được thực hiện trên thiết bị, nên bạn có thể sử dụng tốc độ bit cao hơn để bù cho hầu hết các phép biến đổi bước chia sẻ mà ít có tác động tiêu cực. Các tệp thu được có kích thước lớn chỉ được dùng để thao tác trên thiết bị.

Bạn có thể giảm tốc độ bit ở bước chuyển mã cuối cùng, như minh hoạ trong bảng 2.

Chia sẻ

Tốc độ bit có tác động lớn nhất tại thời điểm chia sẻ, vì tốc độ này liên quan trực tiếp đến kích thước của video sẽ được tải lên. Có sự đánh đổi giữa chất lượng video, thời gian truyền tệp và chi phí lưu trữ trên đám mây.

Ở giai đoạn này, việc lựa chọn hồ sơ mã hoá, các giá trị giới hạn B-frame và QP cũng quan trọng hơn so với trong quá trình chụp.

Bạn nên sử dụng tốc độ bit từ 4 đến 5 Mb/giây (cho độ phân giải 720x1280) để đảm bảo chất lượng hình ảnh tốt.

Thông số lượng tử hoá (QP)

Trên Android 12 trở lên, các khoá QP được chuẩn hoá và có sẵn trong API MediaFormat và trong thư viện Phương tiện NDK. Trên các phiên bản Android cũ, thao tác QP chỉ thực hiện được thông qua các hàm khung sử dụng khoá dành riêng cho nhà cung cấp trong cấu hình MediaFormat.

Đang ghi

Trong khi quay video, hãy sử dụng tính năng kiểm soát tốc độ bit thay vì chế độ cài đặt QP (không phải lúc nào cũng có sẵn).

Bạn không nên điều chỉnh chế độ cài đặt QP cho tốc độ bit thu thập 10 Mb/giây (đối với 720x1280). Nếu tốc độ bit chụp thấp hơn đáng kể, dưới 5 Mb/giây cho 720 x 1280, thì chế độ cài đặt QP 40 là một lựa chọn phù hợp để tăng chất lượng mà không buộc bộ mã hoá và giải mã phải tăng tốc độ bit mục tiêu quá thường xuyên.

Chia sẻ

Giới hạn QP tối đa là 40, đặc biệt là khi tốc độ bit dưới 4 Mb/giây. Tuy điều này đảm bảo chất lượng tối thiểu cho video mã hoá, nhưng có thể tạo ra kết quả với tốc độ bit cao hơn. Tốc độ bit tăng lên phụ thuộc vào độ phức tạp của video. Mặc dù ứng dụng chia sẻ có thể chấp nhận một số phương sai về tốc độ bit của video được tạo, nhưng ứng dụng đó có thể không chấp nhận mức tăng vượt quá một ngưỡng nhất định.

Bạn có thể giới hạn tốc độ tăng tốc độ bit bằng cách mã hoá lại video để chia sẻ với giới hạn QP tối đa ít hạn chế hơn (cao hơn). Điều này giúp bộ mã hoá và giải mã tự do hơn trong việc hy sinh chất lượng và giữ lại các phần khác của video. Bạn có thể mã hoá lại video để chia sẻ vì đây là một hoạt động chuyển mã; bạn đã chụp được video mà bạn định chia sẻ.

Hạn chế là việc lặp lại bước chuyển mã bằng các tham số khác nhau này sẽ làm tăng thời gian cần thiết để chia sẻ video. Một cách để giảm độ trễ này là xem video đã được chuyển mã một phần để quyết định xem video đó có nằm trong phạm vi chấp nhận của bạn về việc vượt quá tốc độ bit hay không. Nếu không, bạn có thể dừng quá trình chuyển mã và thử lại với các tham số QP phù hợp hơn.

Khung B và hồ sơ mã hoá

Cân nhắc chỉ sử dụng khung B trong bước chia sẻ và chỉ khi chạy Android 10 trở lên.

Các ứng dụng nên kiểm tra các hồ sơ mã hoá được hỗ trợ bằng CodecCapabilities, vì không phải thiết bị nào cũng hỗ trợ cấu hình chính hoặc cấu hình cao. Sử dụng cấu hình cao nhất mà bộ mã hoá AVC hỗ trợ: High > Main > Baseline. Để có kết quả an toàn nhất, đừng định cấu hình khung B (KEY_LATENCY hoặc KEY_MAX_B_FRAMES) khi sử dụng hồ sơ cơ sở vì một số bộ mã hoá có thể không định cấu hình được.

Các phân đoạn mã sau đây giả định một 'MediaFormat format' sẽ được dùng để định cấu hình bộ mã hoá AVC

Android 10

API 29 trở lên

Sử dụng cấu hình cao nhất được hỗ trợ và đặt tham số B-frame thành 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

Không đặt KEY_LATENCY trong trường hợp này.

Android 8, 8.1 và 9

API 26, 27, 28

Sử dụng cấu hình được hỗ trợ cao nhất nhưng tắt tính năng tạo khung B. Bản sửa đổi này khắc phục một số hạn chế trong MediaMuxer của các phiên bản hệ thống này

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

Giá trị KEY_LATENCY cấm các bộ mã hoá và giải mã tạo khung B, nhưng vẫn tận dụng các tính năng hiệu quả khác của bộ mã hoá và giải mã.

Nếu ứng dụng của bạn không sử dụng MediaMuxer để tập hợp tệp đầu ra cuối cùng, bạn có thể bật khung B bằng cách đặt giá trị KEY_LATENCY thành 2 thay vì 1. Việc này sẽ cho phép bộ mã hoá và giải mã tạo khung B.

Android 7.1 trở xuống

API 25 trở xuống

Hãy sử dụng hồ sơ cơ sở để có kết quả an toàn nhất.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Trước phiên bản 7, Android AOSP chỉ hỗ trợ hồ sơ cơ sở. Tuy nhiên, nhiều khả năng OEM đã bật cấu hình chính/cấu hình cao trên một số thiết bị, có thể là bằng cách sử dụng hồ sơ dành riêng cho nhà cung cấp.

Nếu ứng dụng của bạn không dùng MediaMuxer, bạn có thể sử dụng cấu hình chính hoặc cấu hình cao khi bộ mã hoá và giải mã hỗ trợ. Không có khoá định dạng công khai để kiểm soát số lượng khung hình B.

Sử dụng mô-đun Transformer để chuyển mã HDR sang SDR

Kể từ Android 13 (API cấp 33), bạn nên sử dụng mô-đun Transformer của Jetpack Media3 để chia sẻ nội dung HDR với các ứng dụng, dịch vụ và thiết bị không hỗ trợ HDR. Mô-đun Transformer hoạt động bằng cách ánh xạ âm cho luồng video HDR đầu vào tới SDR và lưu kết quả dưới dạng MP4. Điều này cho phép phát thành công mà không làm giảm độ sáng chi tiết hoặc độ sáng của hình ảnh.

Lưu ý: Trên các thiết bị nhắm đến các phiên bản hệ thống từ Android 12 (API cấp 32) đến Android 7.0 (API cấp 24), mô-đun Transformer sẽ hoạt động theo cách khác. Nếu thiết bị hỗ trợ HDR, ứng dụng của bạn sẽ phát lại nội dung mà không cần ánh xạ âm. Nếu thiết bị không hỗ trợ HDR, thiết bị sẽ gửi lỗi cho biết tính năng ánh xạ tông màu HDR không được hỗ trợ.

Mã sau đây thiết lập một Bộ biến áp để ánh xạ đầu vào thành SDR và mã hoá lại thành định dạng đầu vào (chẳng hạn như H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Để dùng thử chức năng ánh xạ tông màu, hãy xem Ứng dụng minh hoạ Transformer.

Bạn cũng có thể thiết lập ánh xạ âm bằng MediaCodec, mặc dù việc triển khai phức tạp hơn. Để biết thêm thông tin, hãy xem tài liệu tham khảo về MediaCodec.