2017-02-27 29 views
7

Bana yardım edin:MediaCodec'in H.264 videosunu kodlamak için ortalama + max bit hızı nasıl ayarlanır?

Kameradan H.264 video kodlamak için MediaCodec kullanıyorum, sorun şu ki, telefonumu hareket ettirdiğimde çıktı video kalitesi çok havuzlu, mozaik/görsel bloklarla dolu video.

Benim kodlayıcı bit hızı 500 kbps olduğunu ve bit hızı modu BITRATE_MODE_VBR geçerli:

Belows bazı ayrıntılar vardır.

Bitrate'yi 800 kbps olarak değiştirmeyi deniyorum, çıkış video kalitesi çok fazla gelişir ve bit hızı modunu BITRATE_MODE_CQ olarak değiştirirseniz, çıktı video kalitesi mükemmeldir, ancak bit hızı 1400 kbps'ye kadar artar.

Ortalama bit oranını düşük bir seviyede tutmak istiyorum, ör. 500 kbps, ancak telefon hareket ederken bit hızının biraz daha büyük bit hızına ulaşmasına izin verir, örn. 800 kbps. IOS VideoToolBox'ta, ortalama bit hızını ve maksimum bit hızını ayarlamak için bir API kVTCompressionPropertyKey_DataRateLimits var, ancak Android'de bu ortalama maksimum bit hızı denetimini nasıl sağlayabilirim?

MediaCodec'i yapılandırırken bir "max-bitrate" parametresi gizlendiğini fark ettim, ancak bir etkisi yok (Android çerçevesi bu parametreyi yoksayar, bkz. http://androidxref.com/7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec), ayrıca bir "kalite" gizlemesi olduğunu fark ettim. parametre, ancak aynı zamanda bir etkisi yoktur.

Lütfen yardım edin, teşekkürler !!!

cevap

0

Android kaynak kodundan, KEY_MAX_BIT_RATE maksimum bit hızını ayarlayacaktır. media/java/android/media/MediaCodecInfo.java

private static boolean supportsBitrate(
       Range<Integer> bitrateRange, MediaFormat format) { 
      Map<String, Object> map = format.getMap(); 

      // consider max bitrate over average bitrate for support 
      Integer maxBitrate = (Integer)map.get(MediaFormat.KEY_MAX_BIT_RATE); 
      Integer bitrate = (Integer)map.get(MediaFormat.KEY_BIT_RATE); 
      if (bitrate == null) { 
       bitrate = maxBitrate; 
      } else if (maxBitrate != null) { 
       bitrate = Math.max(bitrate, maxBitrate); 
      } 

      if (bitrate != null && bitrate > 0) { 
       return bitrateRange.contains(bitrate); 
      } 

      return true; 
     } 

gelen anlık aşağıya bakın bu sizin için çalışan varsa bana bildirin.

Video çözünürlüğüne bağlı olarak daha yüksek bir değer koymanızı öneririm. Örneğin 1080p video 500kbps VBR veya CBR'de iyi görünmeyecek.

+0

"KEY_MAX_BIT_RATE" parametresini denedim, aslında anahtar "max-bitrate", ancak VBR'de hiçbir etkisi yok ve parametrenin yerel kod tarafından yok edildiği anlaşılıyor, bkz. Http://androidxref.com /7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec. 720p videoyu kodladığımda, bit hızı 800 kbps olarak ayarlıyorum, kameranın etrafında hareket ettiğimde, çıkış video kalitesi çok kötü, bloklarla dolu, MediaCodec'in giriş verisi arttığında geçici olarak bit hızını artırmasına izin veriyorum, girdi verileri azaldığında bit hızını ortalama seviyeye düşürün, otomatik. Nasıl yapabilirim? – Piasy

+0

Video yonga seti, gecikmenin kaynağıdır. Çok fazla delta yapmasını istiyorsunuz. –