Video paylaşımı için en iyi uygulamalar

Birçok kişi Android cihazlarını kullanarak video paylaşır. Alınan iletinin kalitesi Video, gerçekleştirilen işleme nedeniyle genellikle orijinalinden kötüdür paylaşma uygulamasıdır. Bu belgede, projenizin kalitesinin nasıl optimize edileceği paylaşılan videolar ve kaçınılması gereken, video işleme yaygın bazı hatalardan bahsedeceğiz. Optimizasyon için HDR video içeriği paylaşmak için bkz. Bu sayfada, HDR'yi SDR'ye dönüştürmek için Dönüştürücü modülünü kullanın.

Asıl önemli olan, çözünürlüğünüzü sabit tutmak ve video kalitesini korumaktır. mümkün olduğunca uzun süre yüksek tutmaktır.

Paylaşım ardışık düzeni

Şekil 1'de video paylaşımı için genel bir akış gösterilmektedir:

Video ardışık düzenini paylaşma. Şekil 1. Video paylaşım hattı.

Ardışık düzende şu adımlar bulunur:

  1. Muhtemelen çekim sırasında efektler ekleyerek bir video çekin ve kodlayın. Alternatif olarak, kullanıcı bu adımı atlayıp depolama alanından bir video seçebilir bir uygulama yükleyebilirsiniz.
  2. Videoyu düzenleme, filtreleme, rötuş yapma veya başka bir şekilde işleme
  3. Kod dönüştürme işlemine hazırlanırken videoyu ölçeklendirin veya yeniden boyutlandırın.
  4. Paylaşım için videonun kodunu dönüştürün. 2. adımdaki filtreleme genellikle bu adımın bir parçasıdır.

Ardışık düzende iki adım bulunur. Bu adımda iki adımı videonuzun kalitesini belirleyen parametreler: ve kodu dönüştürmeye ne dersiniz? Ayrıca, Videoyu son kod dönüştürme adımından önce yeniden ölçeklendirin. Bu, kaliteyi de etkileyebilir.

Öneriler

Tablo 1'de video kalitesi için beş ana parametre gösterilmektedir. bu öğelerin hangi adımlarda kullanılabileceğini gösterir.

Parametre Çekim Yapın Paylaş
Profil Y Y
Çözünürlük Y Y
Bit hızı Y Y
Nicelendirme Parametresi (QP) (nadiren) Y
B çerçeveler H Y

Tablo 1. Video kalitesini belirleyen ana parametreler

Profil

Daha iyi sonuçlar elde etmek için, aynı yönetici tarafından sağlanan daha gelişmiş codec. AVC kodlaması için Yüksek profil ve düzey 4'ü seçin.

Çözünürlük, kırpma ve ölçeklendirme

Çekilen videonun ilk çözünürlüğünü ölçeklendirme adımında değiştirebilirsiniz ancak ölçeklendirme, dosyanın kalitesini düşürebilir videosunu izleyin. İlk ekran görüntüsünde ölçeklendirmekten kaçınmanızı ve çözünürlüğü kodundan yararlanırsınız. Ayrıca aşırılıkların özellikle kırpılan resmin boyutunu büyütürseniz düşük kaliteli bir resim elde edersiniz. görüntüsüdür. Aşağıdaki yönergeleri izleyin:

  • En az nihai paylaşım çözünürlüğü kadar büyük bir çözünürlük seçin.
  • Yakalama çözünürlüğü, paylaşım çözünürlüğünü büyük ölçüde aşmamalıdır ara adımların hepsi, büyük ölçekli çerçeveleri (ilk yakalama sırasındaki daha yüksek bit hızı gibi)

    • Paylaşım kodlaması 720x1280 çözünürlük üretiyorsa 720x1280 yakalama çözünürlüğü.
    • Yakalama ve paylaşma arasındaki ara adımlarda kırpma varsa 1080x1920 gibi daha yüksek bir yakalama çözünürlüğüne sahip pikselleri işleyecek bit hızını yakalamanız gerekir.
  • Olağanüstü kırpma işlemi, özellikle kırpılan alanlarda resim kalitesinin düşmesine neden olur. resim büyütüldü.

  • Düşük çözünürlükten yüksek çözünürlüğe yükseltme yapmaktan kaçının. Ölçeklendirme denemeleri mevcut olmayan detaylar oluşturmak için kullanılabilir. İstediğiniz daha yüksek çözünürlüğü yükleyin. en baştan başlayalım.

  • Çözünürlüğü yükseltmeniz gerekiyorsa kodlama parametrelerini ayarlayın. Örneğin, çözünürlüğünün iki katı piksel vardır. Bu da bit hızının iki katıdır.

Çözünürlük ve bit hızı birbiriyle bağlantılıdır. Örneğin, yüksek çözünürlüklü dönüştürme işlemi nihayetinde düşük bit hızına dönüşen bir paylaşım hattı üzerinden video düşük kaliteli bir görüntü üretir. bit hızı azaldığında, daha küçük çözünürlüklerin başladığı geçiş noktaları olur ve daha iyi sonuçlar elde etmek için:

Bit hızı Çözünürlük
5+ Mb/sn 1.080x1.920
1,5 - 5 Mb/sn 720x1.280
1,5 Mb/sn veya daha az SD eşdeğeri. 9:16 en boy oranında aynı piksel sayısı yaklaşık 416x736'dır

Tablo 2. Bit hızı ve Çözünürlük karşılaştırması

Birçok popüler uygulama, videoyu 720p veya daha düşük çözünürlükte paylaşır. Veriler, 1,5 ve üzeri bit hızı hedefleri için 720p çözünürlüğün uygun olduğunu ve 5 Mb/sn.

Bit hızı

Kayıt

Daha yüksek kodlama bit hızı kullanmak, videoda en büyük iyileştirmeyi sağlar. kalitedir. Yerel kamera uygulamalarıyla eşleşen bit hızları seçmenizi öneririz. Örneğin, 720x1280 çözünürlük, 10 Mb/sn yakalama bit hızı önerilir.

Yakalama kodlama işlemi cihaz üzerinde yapıldığından, aşağıdakileri yapmak için daha yüksek bir bit hızı kullanabilirsiniz: çoğu paylaşım adımı dönüşümünü az miktarda negatifle telafi ederek inceleyeceğiz. Oluşturulan daha büyük dosyalar yalnızca cihaz üzerinde değişiklik yapmak için kullanılır.

Tablo 2'de gösterildiği gibi, son kod dönüştürme adımında bit hızını azaltabilirsiniz.

Paylaşılıyor

Paylaşım zamanında en fazla etkiyi yaratan bit hızıdır çünkü doğrudan dosyanın boyutu belirlenebilir. Videolar arasında ödün verilecek bir denge var kalitesi, dosya iletim süresi ve bulut depolama maliyetleri gibi

Kodlama profili, B çerçeveleri ve QP sınırlayıcı değerleri seçimi de daha önemlidir.

İndirme kalitesinin iyi olması için 4-5 Mb/sn (720x1280 çözünürlük için) arasında bir bit hızı öneririz. görsel kaliteyi artırır.

Nicelendirme Parametresi (QP)

Android 12 ve sonraki sürümlerde QP anahtarları standarttır ve MediaFormat API ve NDK Medya kitaplığı. Önceki Android sürümlerinde, QP manipülasyonu yalnızca çerçeve üzerinden kullanılabilir işlevleri için MediaFormat yapılandırmasında satıcıya özel anahtarlar kullanın.

Kayıt

Video çekimi sırasında, varsayılan olarak bulunan QP ayarları yerine bit hızı kontrolünü kullanın. her zaman mevcut olmayabilir.

QP ayarlarını 10 Mb/sn yakalama bit hızları için düzenlemeniz önerilmez. (720x1280 için). Yakalama bit hızı önemli ölçüde düşükse, 720x1280, QP ayarının 40 olması kaliteyi artırmak için iyi bir seçenektir. Ancak codec'i hedef bit hızının üzerinde çekim yapmaya zorlamak zorunda kalmazsınız.

Paylaşılıyor

Özellikle bit hızı 4 Mb/sn'nin altında olduğunda maks. QP sınırının 40 olmasını öneririz. Bu, kodlanmış videolar için minimum kaliteyi garanti etse de yüksek bit hızına sahip olabilir. Bit hızındaki artış, daha da karmaşık hale getirin. Paylaşım uygulaması, konumdaki bazı sapmaları bit hızında bir artışa tolerans göstermeyebilir. sağlayabilir.

Videoyu bir daha az kısıtlayıcı (daha yüksek) maks. QP sınırı. Bu şekilde, codec bileşenine Kaliteden ödün vermek ve videonun diğer kısımlarını korumak. Yeniden kodlayarak Kod dönüştürme işlemi olduğundan paylaşım için video; zaten var paylaşmak istediğiniz bir video çekti.

Dezavantajı, kod dönüştürme adımını bu farklı parametreleri, videoyu paylaşmak için gereken süreyi artırır. Azaltmanın bir yolu bu gecikme, kısmen dönüştürülmüş videoya bakmak ve videonun değeri toleransınıza sokun. Aksi takdirde, kod dönüştürmeyi deneyin ve daha uygun QP parametreleriyle tekrar deneyin.

B çerçeveler ve kodlama profilleri

B kareleri yalnızca paylaşım adımı sırasında ve yalnızca çalışırken kullanmayı düşünün Android 10 veya sonraki sürümler.

Uygulamalar, desteklenen kodlama profillerini CodecCapabilities çünkü tüm cihazlar ana veya yüksek profilleri desteklemez. En yüksek profili kullan AVC kodlayıcı tarafından desteklenir: Yüksek > Ana > Referans değer. En güvenli sonuçlar için B çerçeveleri yapılandırma (KEY_LATENCY veya KEY_MAX_B_FRAMES) referans değer kullanıldığında bazı kodlayıcılar yapılandırılamayabilir.

Aşağıdaki kod segmentleri, şu amaçla kullanılacak bir 'MediaFormat format' olduğunu varsayar: AVC kodlayıcıyı yapılandırın

Android 10

API 29 veya sonraki sürümler

Desteklenen en yüksek profili kullanın ve B çerçevesi parametresini 1 değerine ayarlayın:

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

Bu durumda KEY_LATENCY özelliğini ayarlamayın.

Android 8, 8.1 ve 9

API'ler 26, 27, 28

En yüksek desteklenen profili kullanın ancak B çerçevelerin oluşturulmasını devre dışı bırakın. Bu Bu sistem sürümlerinde MediaMuxer

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

KEY_LATENCY değeri, codec'lerin B çerçeveleri oluşturmasını yasaklar ancak yine de diğer codec verimliliğinden yararlanır.

Uygulamanız nihai çıkış dosyasını derlemek için MediaMuxer kullanmıyorsa şunu yapabilirsiniz: KEY_LATENCY değerini 1 yerine 2 olarak ayarlayarak B karelerini etkinleştirin. Bu codec'in B kareleri üretmesine izin verir.

Android 7.1 ve önceki sürümler

API 25 ve önceki sürümler

En güvenli sonuçlar için referans profili kullanın.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Sürüm 7'den önceki Android AOSP yalnızca temel profili destekler. Ancak, OEM'lerin bazı cihazlarda ana/üst profili etkinleştirmiş olma olasılığı, bir profil oluşturabilirsiniz.

Uygulamanızda MediaMuxer kullanılmıyorsa ana veya yüksek profili kullanabilirsiniz codec tarafından desteklenir. B- çerçeveler.

HDR'yi SDR'ye dönüştürmek için Transformer modülünü kullanma

Android 13 (API düzeyi 33) sürümünden itibaren, Jetpack Media3’ün Dönüştürücü modülünü kullanarak HDR içeriği paylaşmayan uygulama, hizmet ve cihazlarla HDR desteği var. Transformer modülü, tablodaki ton haritalarıyla HDR video akışını SDR'ye aktarabilir ve sonucu MP4 olarak kaydedebilirsiniz. Böylece, ve görüntü parlaklığı kaybı olmadan başarıyla oynatmanıza olanak tanır.

Not: Android 12 (API düzeyi 32) arasındaki sistem sürümlerini hedefleyen cihazlarda Dönüştürücü modülü, Android 7.0 (API düzeyi 24) sürümüne kadar farklı şekilde çalışır. Eğer uygulamanız HDR'yi destekliyorsa, uygulamanız içeriği ton eşleme olmadan oynatır. Cihaz, HDR'yi desteklemiyorsa HDR'nin etkinleştirildiğini belirten bir hata mesajı verir. ton eşleme desteklenmiyor.

Aşağıdaki kod, tonu SDR ile eşleyen bir Transformatör oluşturur ve giriş biçiminde (H.264/AVC gibi) yeniden kodlar:

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();

Ton eşleme işlevini denemek için Transformer demo uygulaması.

Ton eşlemeyi, MediaCodec daha karmaşıktır. Daha fazla bilgi için MediaCodec referans belgeleri.