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 nội dung nhận được video thường có chất lượng kém hơn video gốc do quá trình xử lý được thực hiện thông qua ứng dụng chia sẻ. Tài liệu này mô tả cách tối ưu hoá chất lượng của được chia sẻ và một số lỗi xử lý video phổ biến cần tránh. Để tối ưu hoá để chia sẻ nội dung video HDR, hãy xem Sử dụng mô-đun Bộ chuyển đổi để chuyển mã HDR sang SDR trên trang này.

Việc 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ạ 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 quá trình 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 ghi âm 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ó thể thiết lập các thông số xác định chất lượng video của bạn: mã hoá trong lúc đầu ghi và chuyển mã trước khi chia sẻ. Ngoài ra, có thể bạn cần điều chỉnh kích thước 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 trình bày 5 tham số chính về chất lượng video và cho biết bước nào có thể sử dụng chúng.

Thông 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ử (QP) (hiếm khi) Y
Khung B N Y

Bảng 1. Các tham 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 hồ sơ nâng cao hơn do bộ mã hoá và giải mã. Để mã hoá AVC, 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 điều chỉnh tỷ lệ trước khi chuyển mã để chia sẻ, nhưng việc mở rộng quy mô có thể làm giảm chất lượng video. Bạn nên tránh điều chỉnh tỷ lệ và chọn độ phân giải cho giai đoạn đầu mã hoá mà bạn có thể sử dụng trong suốt quy trình. Đừng quên rằng cực đoan việc cắt xén sẽ dẫn đến hình ảnh có chất lượng thấp, đặc biệt nếu bạn tăng độ phân giải hình ảnh. 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ừ khi tất cả các bước trung gian được thiết kế để hỗ trợ (chẳng hạn như tốc độ bit cao hơn trong lần chụp đầu tiên).

    • Nếu mã hoá chia sẻ tạo ra độ phân giải 720x1280, chúng tôi khuyên bạn Độ phân giải chụp 720x1280.
    • Nếu các bước trung gian giữa chụp ảnh và chia sẻ bao gồm cắt ảnh, hãy sử dụng có độ phân giải hình ảnh cao hơn như 1080x1920, đồng thời 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à nếu hình ảnh bị cắt hình ảnh đã được nâng cấp.

  • Tránh nâng cấp hình ảnh từ độ phân giải thấp lên độ phân giải cao hơn. Lần thử tăng độ phân giải để tạo chi tiết không có sẵn. Chuyển sang độ phân giải cao hơn mà bạn muốn ngay từ đầu.

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

Độ phân giải và tốc độ bit có mối quan hệ qua lại với nhau. Ví dụ: chuẩn bị một thẻ video thông qua một hệ thống 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 việc bắt đầu với độ phân giải thấp hơn. Là tốc độ bit giảm, có những điểm giao nhau 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 SD. Số lượng pixel tương tự theo 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 biết rằng độ phân giải 720p là lựa chọn phù hợp cho các mục tiêu tốc độ bit trong khoảng từ 1,5 và 5 Mb/giây.

Tốc độ bit

Đang ghi

Việc sử dụng tốc độ bit mã hoá cao hơn sẽ giúp cải thiện hiệu quả nhất video chất lượng. 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, tốc độ bit chụp là 10 Mb/giây.

Vì quá trình mã hoá ảnh chụ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ù đắp cho hầu hết các chuyển đổi bước chia sẻ với một chút tiêu cực của bạn. Các tệp kết quả lớn hơ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 nhiều nhất tại thời điểm chia sẻ, vì tốc độ này liên quan trực tiếp đến của video sẽ được tải lên. Có sự đánh đổi giữa video chất lượng, thời gian truyền tệp và chi phí lưu trữ đám mây.

Lựa chọn hồ sơ mã hoá, khung B và giá trị giới hạn QP cũng nhiều hơn quan trọng ở giai đoạn này so với trong khi chụp.

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

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

Trên Android 12 trở lên, các khoá QP được chuẩn hoá và có trong MediaFormat và trong Thư viện Nội dung đa 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 khung bằng cách 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 chế độ kiểm soát tốc độ bit thay vì chế độ cài đặt QP, vốn là 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 đối với tốc độ bit chụp 10 Mb/giây (đối với độ phân giải 720x1280). Nếu tốc độ bit chụp thấp hơn đáng kể, dưới 5 Mb/giây đối với 720x1280, cài đặt QP là 40 là sự cân bằng hợp lý giữa chất lượng tăng mà không buộc bộ mã hoá và giải mã vượt quá 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. Mặc dù điều này đảm bảo chất lượng tối thiểu cho các video mã hoá nhưng nó có thể tạo ra cho kết quả có tốc độ bit cao hơn. Mức tăng tốc độ bit phụ thuộc vào độ phức tạp của video. Mặc dù một ứng dụng chia sẻ có thể chấp nhận một số khác biệt trong của video được tạo, thì video đó có thể không chấp nhận mức tăng vượt quá ngưỡng nhất định.

Bạn có thể giới hạn mứ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 hy sinh chất lượng và giữ được các phần khác của video. Bạn có thể mã hoá lại để chia sẻ vì đây là một hoạt động chuyển mã; bạn đã có quay được video mà bạn định chia sẻ.

Nhược điểm là việc lặp lại bước chuyển mã với 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 đó trong phạm vi cho phép của bạn đối với tình trạng tăng tốc độ bit. Nếu không, bạn có thể dừng chuyển mã và thử lại với các thông số QP phù hợp hơn.

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

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

Ứng dụng nên kiểm tra các hồ sơ mã hoá được hỗ trợ bằng cách sử dụng CodecCapabilities! vì không phải thiết bị nào cũng hỗ trợ hồ sơ chính hoặc hồ sơ cao. Sử dụng hồ sơ cao nhất được hỗ trợ bởi bộ mã hoá AVC: Cao > Chính > Đường cơ sở. Để 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 đường cơ sở vì một số bộ mã hoá có thể bị lỗi cấu hình.

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

Hãy 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);

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

Android 8, 8.1 và 9

API 26, 27, 28

Hãy sử dụng cấu hình được hỗ trợ cao nhất, nhưng vô hiệu hoá việc tạo khung B. Chiến dịch này giúp giải quyết một số hạn chế về MediaMuxer trong 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 hiệu quả của bộ mã hoá và giải mã khác.

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 là 2 thay vì 1. Thao tá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

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, việc này có 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ể bằng cách thông qua 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ể dùng hồ sơ chính hoặc hồ sơ cao khi mà bộ mã hoá và giải mã hỗ trợ. Không có khoá định dạng công khai nào để kiểm soát số lượng B- khung hình.

Sử dụng mô-đun Bộ chuyển đổi để chuyển mã HDR thành SDR

Kể từ Android 13 (API cấp 33), bạn nên dùng Jetpack Media3 Bộ chuyển đổi để chia sẻ nội dung HDR với những ứ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ạ tông màu và đầu vào luồng video HDR sang SDR và lưu kết quả dưới dạng MP4, cho phép phát thành công mà không làm giảm độ chi tiết hoặc độ sáng của hình ảnh.

Lưu ý: Trên các thiết bị nhắm đến phiên bản hệ thống trong khoảng từ Android 12 (API cấp 32) xuống 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 nội dung mà không cần ánh xạ tông màu. Nếu thiết bị không hỗ trợ HDR, hệ thống sẽ hiển thị thông báo lỗi cho biết HDR không hỗ trợ tính năng ánh xạ tông màu.

Đoạn mã sau đây thiết lập Bộ biến áp có âm ánh xạ đầu vào tới SDR và mã hoá lại ở đị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 tạo bản đồ âm báo, hãy xem Ứng dụng minh hoạ về bộ chuyển đổi.

Bạn cũng có thể thiết lập chế độ ánh xạ âm thanh bằng cách sử dụ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.