2013-03-15 2 views
1

미디어 작업을 위해 안드로이드 전화에서 libstagefright.so을 사용하고 싶습니다. 나는 this 페이지에서 주어진 예제를 탐구했다. 나는 같은 것을 구현하려고 노력 해왔다. 여러 OMXCodec 인스턴스에 대해이 구현을 테스트하는 동안 출력 버퍼가 서로 충돌합니다.무대 장치를 사용하여 OMXCodec의 여러 인스턴스를 만들 수 있습니까

이클립스에서 안드로이드 프로젝트를 개발했으며 JNI에서 libstagefright을 연결했습니다. 나는 두 클래스 인 CustomDataSource (MediaSource을 파생)과 CustomOmxDecoder을 추가했습니다. CustomDataSource 클래스는 모든 가상 메서드 MediaSource을 구현합니다. CustomOmxDecoder 클래스에는 OMXCodec::Create 메서드가 호출됩니다. 그런 다음 CustomOmxDecoder의 개별 인스턴스가있는 두 개의 스레드를 만들었습니다. 이 인스턴스를 사용하여 이라는 메쏘드를 호출하는데, 그 중 메인은 videoDecoder->read() 메쏘드입니다. 이것은 내 설치 방법입니다.

지금, 위의 설정으로 앱을 실행할 때. OMXCodec 두 원본의 프레임을 디코딩하지만 표면에 렌더링 할 때 출력이 충돌하는 것을 보여줍니다. 그것은 두 소스의 디코딩 된 버퍼가 어떻게 든 내부적으로 메쉬 처리 된 것처럼 보입니다. 나는 동시에 두 개의 h264 디코더를 만들고있다. 여기서 문제가 될 수있는 것은 무엇입니까? MediaBufferGroup과 관련이 있습니까? 나는 CustomDataSource에 버퍼를 획득하고 videoDecoder->read() 호출을 호출 한 후 CustomOmxDecoderProcessNextFrame에 버퍼를 릴리스합니다.

어떤 제안이 좋을 것입니다. 감사합니다. .

+1

'allocateOutputBuffersfromNativeWindow'를 사용한다면, 디코더 생성에 전달 된'nativeWindow' 또는'surface'를 체크 할 필요가 있습니다. 귀하의 의견에서, 나는 당신이 잘못된 이미지를 보았을 수도 있기 때문에 양쪽 모두 동일한 '표면'을 디코더의 인스턴스에 전달하고 있다고 느낍니다. 당신의 논리가 디코더의 한 인스턴스에서만 잘 작동 하는지를 확인할 수 있습니까? – Ganesh

+0

실제로 omxcodec 인스턴스를 만드는 동안 매개 변수로 서피스를 전달하지 않습니다. 표면 주소를 확인 했어. 그들은 다르다. 심지어 하나의 더 많은 테스트를 해봤는데, 디코드 디스플레이 메서드에서 customomxdecoder 클래스의 조건을 추가했습니다. 하나의 디코딩 된 버퍼가 주어진 표면에 렌더링되고 스레드 2에 대해 프레임이 디코딩되지만 표면은 검정색 만 렌더링합니다. . 이 경우에도 그림은 첫 번째 표면에서 충돌을 가져오고 두 번째 표면은 검은 색으로 표시됩니다. – sam18

+0

당신은 자동 잠금/뮤텍스 사이에서 비디오 소스 -> 읽기 (& 버퍼, & 옵션) 방법을 다룰 필요가 있다고 생각합니까? – sam18

답변

2

나는 OMXCodec의 여러 인스턴스가 가능하다는 것을 의심하면서 내 문제를 테스트하고 해결했습니다. 문제는 내 코드에 있습니다. 그리고 고칠 때 OMXCodec의 여러 인스턴스가 안정적이고 매끄럽게 실행되는 것을 볼 수 있습니다. 그렇습니다. OMXCodec의 여러 사례가 있습니다.

여러분 모두 감사드립니다.