Xem trước nội dung chỉnh sửa bằng CompositionPlayer

Thư viện Jetpack Media3 cung cấp API CompositionPlayer, một phương thức triển khai Player mạnh mẽ để xem trước nội dung chỉnh sửa video theo thời gian thực. Nếu ứng dụng của bạn cho phép người dùng chỉnh sửa video, chẳng hạn như áp dụng hiệu ứng, cắt hoặc kết hợp nhiều mục nội dung nghe nhìn đầu vào, thì CompositionPlayer sẽ giúp bạn hiển thị bản xem trước chính xác của đầu ra. Điều này có thể hữu ích trong trường hợp bạn không cần lưu các nội dung chỉnh sửa đã áp dụng hoặc để xác thực rằng các nội dung chỉnh sửa được định cấu hình như dự kiến trước khi cam kết xuất video cuối cùng.

CompositionPlayer là gì?

CompositionPlayer là một cách triển khai chuyên biệt của giao diện Người chơi, được thiết kế riêng để phát các đối tượng Composition. Composition xác định cách sắp xếp các thành phần nội dung nghe nhìn đầu vào (chẳng hạn như đoạn video và bản âm thanh) cũng như những hiệu ứng âm thanh và video cần áp dụng cho các thành phần đó. Để tìm hiểu thêm về API Composition, hãy xem phần Xác định Composition của các mục nội dung nghe nhìn.

Mục đích chính của CompositionPlayer là kết xuất Composition này, hoàn chỉnh với tất cả nội dung chỉnh sửa đã chỉ định, theo thời gian thực, cho phép người dùng xem chính xác nội dung chỉnh sửa của họ sẽ trông như thế nào trước khi thực hiện quy trình xuất có thể tốn thời gian và tài nguyên. Sau đó, bạn có thể sử dụng cùng một đối tượng Composition với một phiên bản Transformer để xuất. Bạn có thể tìm hiểu thêm về việc này trong phần Xuất Composition.

CompositionPlayer so với ExoPlayer

Mặc dù cả CompositionPlayerExoPlayer đều là các phương thức triển khai Player trong Media3, nhưng chúng được tối ưu hoá cho các trường hợp sử dụng khác nhau:

Tính năng

CompositionPlayer

ExoPlayer

Nguồn đầu vào nội dung nghe nhìn

Lấy một đối tượng Composition duy nhất, có thể bao gồm nhiều thực thể EditedMediaItem với các hiệu ứng cho từng mục.

Lấy một MediaItem hoặc một danh sách phát gồm các thực thể MediaItem.

Dòng thời gian

Dòng thời gian và thời lượng dựa trên toàn bộ Bản sáng tác.

Dòng thời gian và thời lượng tương ứng với MediaItem đang phát.

Hiệu ứng

Hiệu ứng được xác định trong Thành phần và có thể được áp dụng cho từng EditedMediaItem hoặc cho toàn bộ Thành phần.

Hiệu ứng được đặt trên chính thực thể ExoPlayer bằng setVideoEffects() và mỗi hiệu ứng được áp dụng riêng cho từng mục trong danh sách phát.

Về cơ bản, CompositionPlayer hữu ích nhất khi bạn cần kết xuất một Composition phức tạp gồm nội dung nghe nhìn và hiệu ứng, thường là trong bối cảnh chỉnh sửa. Sử dụng ExoPlayer để phát nội dung âm thanh hoặc video cho mục đích chung, hoặc để xem trước nội dung chỉnh sửa một tài sản bằng setVideoEffects().

CompositionPlayer để xem trước

Việc tích hợp CompositionPlayer vào ứng dụng của bạn bao gồm một số bước chính. Trước tiên, hãy sử dụng mẫu Trình tạo để tạo thực thể CompositionPlayer, sau đó đặt Composition sẽ phát:

val compositionPlayer = CompositionPlayer.Builder(context).build()
compositionPlayer.setComposition(composition)
compositionPlayer.prepare()
compositionPlayer.play()

Để biết hướng dẫn về cách tạo Composition, hãy xem phần Tạo Composition.

Xin lưu ý rằng vì CompositionPlayer triển khai giao diện Player, nên sau đó bạn có thể đặt đầu ra mục tiêuđiều khiển trình phát thông qua các phương thức Player tiêu chuẩn.

Xử lý lỗi

Đính kèm một thực thể Player.Listener vào CompositionPlayer để phản ứng với các sự kiện và lỗi phát. Lệnh gọi lại onPlayerError() cũng sẽ hiển thị mọi vấn đề phát sinh từ các thành phần dành riêng cho việc chỉnh sửa, chẳng hạn như Composition hoặc VideoGraph.Factory. Hãy đọc tài liệu về Sự kiện của trình phát để biết thêm thông tin chi tiết.

Những điểm quan trọng cần lưu ý

Một số tính năng và hạn chế cần lưu ý khi bạn sử dụng CompositionPlayer:

  • Mặc dù CompositionPlayer dựa trên giao diện Player, nhưng một số hành vi của giao diện này khác với ExoPlayer vì giao diện này phụ thuộc vào Composition để phát. Ví dụ: CompositionPlayer chỉ hỗ trợ việc đặt chế độ lặp lại thành REPEAT_MODE_OFF hoặc REPEAT_MODE_ALL.
  • Theo mặc định, CompositionPlayer sử dụng SingleInputVideoGraph.Factory, nhưng nếu Thành phần của bạn sử dụng nhiều chuỗi có các mục hình ảnh hoặc video, bạn nên sử dụng setVideoGraphFactory() khi tạo phiên bản CompositionPlayer để thay vào đó sử dụng MultipleInputVideoGraph.Factory. Một SingleInputVideoGraph.Factory là đủ nếu chỉ có một chuỗi có các mục hình ảnh hoặc video, còn các chuỗi khác chỉ có âm thanh.
  • Tất cả các mục nội dung nghe nhìn trong Thành phần của bạn phải có thời lượng được đặt rõ ràng, bằng MediaItem.Builder.setImageDurationMs() cho hình ảnh hoặc bằng EditedMediaItem.Builder.setDurationUs() cho âm thanh hoặc video.

Các trường hợp sử dụng sau đây được hỗ trợ:

  • Xem trước một thành phần.
  • Bản xem trước một chuỗi (tức là các mục nội dung nghe nhìn tuần tự).
  • Xem trước một chuỗi video + một chuỗi âm thanh (ví dụ: âm thanh nền).

Các trường hợp sử dụng sau đây đang được phát triển:

  • Chế độ xem trước nhiều thành phần, bao gồm cả các bố cục như hình trong hình, cạnh nhau và lưới, trong đó có nhiều chuỗi video.
  • Tuỳ chỉnh quy trình chỉnh sửa bằng một công cụ đồ hoạ khác.

Yêu cầu về tính năng

Nếu bạn có yêu cầu về tính năng hoặc ý kiến phản hồi cho CompositionPlayer, hãy báo cáo vấn đề trên kho lưu trữ Media3 trên GitHub.