2015-06-02 13 views
6

Grafika'nın "Sürekli Çekim" Etkinliği hakkında bir şeyler öğreniyorum MediaCodec ile bir video kaydetmekle ilgili.Grafika'nın "Sürekli Çekim" Etkinliği için MediaCodec ile kodlamadan önce video kırpın

aktivite kaynak kodu programı kameradan veri almak için bir SurfaceTexture obj kullanır ve bu SurfaceTexture obj ile 2 EGLSurface obj oluşturur https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java

olan, bir EGLSurface obj MediaCodec veri ve diğer beslemeler veri beslemelerini Kamera önizleme için SurfaceView. MediaCodec verileri h264 verilerine kodlar ve MediaMuxer obj h264 verilerini bir mp4 dosyasına yazar.

Ancak bir sorun var, kamera tarafından desteklenen önizleme boyutu, 1920 * 1080, 1440 * 1080,720 * 480 vb. Gibi arazi alanıdır (genişlik> yükseklik). Genellikle, bir video kaydettiğimizde telefonu dikey yönde alırız, bu yüzden resmi dikey olarak döndürmek için API: Camera.setDisplayOrientation (90) kullanmalıyız, ardından bir portre videosu kaydedilecektir.

Ancak elimde bulunan telefon resmiyle bir manzara videosu kaydetmek istiyorum, her kareyi kameradan kesmem gerekiyor. Benim yöntemim, her bir kare resmin alt ve üstünü keserek resmin ortasını koruduğunda, soldaki resim bir manzara olacak.

Ancak opengl ile aşina değilim, SurfaceTexture verilerini nasıl kırpacağımı bilmiyorum. Opengl'de iyi olan herkes bana biraz yardım edebilir mi?

cevap

12

"Fotoğraf makinesinden doku" etkinliğine bakın. Görüntüyü çeşitli şekillerde, özellikle "zum" u manipüle etmenize izin verdiğini unutmayın. "Yakınlaştırma", doku koordinatlarını değiştirerek yapılır.

ScaledDrawable2D sınıfı bunu yapar; setScale() araması, rektin kendisini ölçeklemek yerine "yakınlaştırmayı" değiştirir. Doku koordinatları 0,0 ile 1,0 arasında değişir ve getTexCoordArray() yöntemi, dokuların bir alt kümesini kapsayacak şekilde değiştirir.

Çerçeveleri kırpmak için doku koordinatlarını orantısal olarak değiştirmeniz gerekir. Buna

[0.0, 0.0] [1.0, 0.0] 
[0.0, 1.0] [1.0, 1.0] 

:

[0.0, 280/1280.0] [1.0, 280/1280.0] 
[0.0, 1000/1280.0] [1.0, 1000/1280.0] 

ve daha sonra bir kare o işlemek yerine giriş video portre 720x1280 olduğunu ve 720x720 istiyorsanız Örneğin, bu koordinatları değiştirecek bir dikdörtgen.

+0

Çok teşekkür ederim! cevabım problemimi tam olarak çözdü! Stackoverflow profilinizi ziyaret ettim. Google'da uzun yıllardır çalıştığınızı ve Android işletim sisteminin geliştirilmesine kendini adadığını biliyorum. Bir kelimeyle, sen tanrısal bir programcı sensin. – dragonfly

+0

Grafika ve bigflake'in yazarı olduğunuzu görmekten heyecan duyuyorum, çünkü ikisini de inceledim ve bir soru sormam gerekiyor. MediaCodec hakkında video ve ses de dahil olmak üzere çeşitli demolar yazdınız. Ancak hem görüntü hem de ses kaydı yapan herhangi bir demo yok. MediaCodec ile eşzamanlı olarak video ve ses verilerini kodlayabiliriz ve MediaMuxer ile mp4 dosyasına yazabiliriz, ama neden böyle bir demo yazmadınız? Şimdi böyle bir demo yazmaya başladım ama buna yeniyim. Bana bazı tavsiyelerde bulunabilir misiniz? – dragonfly

+0

"Medya" ekibi değil, "grafikler" takımındaydım, bu yüzden MediaCodec'e grafikler göndermek günlük işimin bir parçasıydı. Ses sıkıştırmasıyla çalışmadım ve hiçbir zaman onunla oynamaya gelmedim, yani A/V demosu yok. Planınız doğru: sesi işleyen ve her birinin çıkışını iki parça içeren tek bir MediaMuxer örneğine besleyen ikinci bir MediaCodec oluşturun.Muxer bölümü https://android.googlesource.com/platform/cts/+/lollipop-release/tests/tests/media/src/android/media/cts/MediaMuxerTest.java adresinde test edilmiştir, ancak MediaExtractor yerine MediaCodec. – fadden

İlgili konular