2013-10-08 3 views
7

feed MediaCodec with Surface input은 CameraPreview와 같은 방법으로 시연되었지만 MediaCodec에 제출하기 전에이 입력을 버퍼링하는 실제적인 방법이 있습니까? 제 experiments에서MediaCodec의 표면 입력 버퍼링

가 갤럭시 넥서스 byte[] 또는 ByteBuffer 입력으로 MediaCodec 사용시 CameraToMpegTest.java

에 직접 동기 부호화 방법을 이용하여 오디오/비디오 스트림을 생산 용인 딸꾹질 경험 우리는 ExecutorService로 인코딩되지 않은 데이터를 전송할 수 또는 유사한 대기열을 사용하여 응용 프로그램의 제어에서 CPU 사용량이 급격하게 증가하더라도 프레임이 삭제되지 않도록 할 수 있습니다. 그러나, 수행하는 요구 사항으로 인해 color format conversion between Android's Camera and MediaCodec이 방법은 고해상도 라이브 비디오에 비현실적입니다.

생각 :

  1. MediaCodec-EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)로 만든 NativePixmapType을 공급하는 방법이 있나요?

  2. 카메라와 MediaCodec간에 ByteBuffer 형식을 조화시키는 것이 로드맵에 있는지 여부에 대한 Android의 의견은 누구에게도 설명 할 수 있습니까?

+0

MediaCodec의 입력에 프레임을 전달할 때 딸꾹질을 해결할 방법을 찾았습니까? 필자는 MediaMuxer에 출력 할 때 MediaCodec의 출력을 버퍼링하고 있습니다. 하지만 MediaMuxer의 입력을 먹이 swapBuffers()를 호출 할 때 딸꾹질을 겪고 있습니다. – Petrakeas

답변

3

정말 데이터를 전혀 복사하고 싶지 않습니다. 대량의 데이터를 저장하고 복사하는 것은 프레임 속도를 죽일만큼 오래 걸릴 수 있습니다. 이것은 일반적으로 U/V 평면 스왑을 수행 할 필요가 없더라도 byte [] 및 ByteBuffer [] 솔루션을 배제합니다.

시스템을 통해 데이터를 이동하는 가장 효율적인 방법은 표면을 사용하는 것입니다. 속임수는 Surface가 버퍼가 아니며, queue of buffers에 대한 인터페이스입니다. 버퍼는 참조로 전달됩니다. unlockCanvasAndPost()을 사용하면 현재 버퍼를 소비자 대기열에 배치하는 경우가 많습니다. 이는 종종 다른 프로세스에 있습니다.

새 버퍼를 만들고 대기열에서 사용하는 집합에 추가하거나 대기열에서 버퍼를 추출하는 공개 메커니즘이 없으므로 측면에 DIY 버퍼링 체계를 구현할 수 없습니다. 풀의 버퍼 수를 변경하는 공용 인터페이스는 없습니다.

딸꾹질의 원인을 파악하는 것이 유용 할 것입니다. 이러한 문제를 분석하는 Android 도구는 systrace이며 Android 4.1 이상 (docs, example, bigflake example)에서 사용할 수 있습니다. CPU로드 소스를 식별하거나 CPU가 아니라 코드가 얽히고 결의가났다면 Surface에 버퍼를 추가하는 것보다 훨씬 쉬운 솔루션을 제공 할 수 있습니다.

+0

큰 충고! Systrace가 정말 도움이되었습니다. 'Trace' 세그먼트를 중첩 할 수 있습니까? 나는 부모 안에서 시작하고 끝나는 부분을 나타내는 것처럼 보이지 않습니다. – dbro

+0

작동해야합니다. 나는 onCreate()의 여러 지점에서 두 개의 beginSection() 호출, 끝에서 두 개의 endSection() 호출을 사용하여 간단한 예제를 시도하고 예상 한 것을 얻었다. – fadden

+0

기기에서 h264 TS 파일 또는 UDP (라이브 카메라 피드 또는 서버에서 H264 TS 스트리밍)를 통해 비디오를 스트리밍하는 동안 태블릿에 "딸꾹질"이 표시됩니다. 갤럭시 노트 10.1 (4.1.2 포함) , 그것의 앞에 여기에) 딸꾹질 또한 항상 BufferInfo를 반환합니다.크기가 0 인 경우 (코덱 용 CTS가 들어갈 때까지 최소 sdk를 18 (4.3)으로 올렸습니다) ... 그러나 Lenovo Yoga 10 @ 4.3은 재생 중 끊김이 있습니다 ... 이는 입력 버퍼는 거의 사용할 수 없습니다 ... – PapaWhiskey

관련 문제