2013-10-08 32 views
7

CameraPreview gibi feed MediaCodec with Surface input'un nasıl gösterildiği gösterildi, ancak bu girdiyi MediaCodec ürününe göndermeden önce arabelleğe almanın pratik yolları var mı? Benim experiments yılındaMediaCodec'e Tamponlama Yüzey girişi

, Galaxy Nexus byte[] veya ByteBuffer girişli MediaCodec kullanırken CameraToMpegTest.java

doğrudan, senkron kodlama yöntemi kullanarak ses/video akışı üretiminde kabul edilemez hıçkırık yaşar, bir ExecutorService için kodlanmamış veri gönderebilir Cihazın uygulama kontrolümüz dışında CPU kullanımında ani artışlar yaşansa bile, kareler oluşmamasını sağlamak için işleme için benzer bir kuyruk. Ancak, color format conversion between Android's Camera and MediaCodec gerçekleştirme gerekliliği nedeniyle, bu yöntem yüksek çözünürlüklü, canlı video için gerçekçi değildir.

Düşünceler:

  1. MediaCodec için EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p) ile oluşturulan NativePixmapType beslemek için bir yolu var mı?

  2. Android'den herhangi bir kişi, Kamera ile MediaCodec arasında ByteBuffer biçimlerinin uyumlu hale getirilip getirilmediğini yol haritası üzerinde yorumlayabilir mi?

+0

Bu nedenle, MediaCodec'in girdisine kareleri geçirirken hıçkırıkları çözmenin bir yolunu buldunuz mu? Benim durumumda, MediaModer'a beslerken MediaCodec'in çıktısını tamponluyorum. Ancak, MediaMuxer'in girdisini beslemek için swapBuffers() öğesini çağırırken hıçkırıklar yaşıyorum. – Petrakeas

cevap

3

Gerçekten de verileri kopyalamak istemezsiniz. Büyük miktarda bir veri depolama ve kopyalama için çerçeve ayırma, kare hızınızı öldürecek kadar uzun sürebilir. Bu, bir U/V düzlemi takası yapmak zorunda olmasanız bile, genellikle bayt [] ve ByteBuffer [] çözümlerini dışlar.

Verileri sistem üzerinden taşımak için en etkili yol bir Yüzey ile. Hile bir Yüzey bir tampon değil, bir queue of buffers için bir arabirim. Tamponlar referans ile geçirilir; unlockCanvasAndPost()'u kullandığınızda, aslında geçerli arabelleği, genellikle farklı bir işlemde olan tüketici için bir kuyruğa yerleştirirsiniz.

Yeni bir arabellek oluşturmak ve sıraya göre kullanılan kümeye eklemek veya sıradaki arabellekleri ayıklamak için genel bir mekanizma yoktur, bu nedenle yandaki bir DIY arabellek düzeni uygulayamazsınız. Havuzdaki arabellek sayısını değiştirmek için genel bir arayüz yoktur.

Hıçkırıklara sebep olan şeyin ne olduğunu bilmek faydalı olacaktır. Bu tür sorunları analiz etmek için Android aracı, Android 4.1+ sürümünde mevcut olan sistrace'dir (docs, example, bigflake example). CPU yükünün kaynağını tanımlayabilir ya da CPU olmadığını, ancak bir miktar kodun karıştığını belirlerseniz, yüzeye daha fazla arabellek eklemekten çok daha kolay bir çözümünüz olacaktır.

+0

Büyük tavsiye! Systrace gerçekten yardımcı oldu. Trace parçalarını yerleştirmek mümkün mü? Bir ebeveynin görünmesi için başlayan ve biten bölümleri elde edemiyorum. – dbro

+0

Çalışmalı. Ben basit bir örnek (onCreate(), farklı iki noktadaki "beginSection()" çağrılarını, iki "endSection()" çağrıları en sonunda) denedim ve beklediğim şeyi aldım. – fadden

+0

Cihazda bir h264 TS dosyasından veya UDP üzerinden (canlı kamera beslemesi veya bir sunucudan H264 TS akışı) video akışı yapmaya çalışırken tabletlerde "hıçkırık" görüyorum. 4.1.2 ile bir gökada notu 10.1 (bence , benim önümde değil) hıçkırık ve ayrıca her zaman BufferInfo döndürür.0 boyutu (o zamandan beri codec için CTS gittiğinde asgari sdk'mizi 18'e (4.3) çıkardık) ... ancak Lenovo Yoga 10 4.3'de oynatma sırasında katı kekemeye sahip ... Giriş arabellekleri nadiren kullanılabilir ... – PapaWhiskey

İlgili konular