10

나는 SD 카드의 순환 버퍼에 연속적인 비디오를 캡처하여 사용자가 이벤트 발생 후 이벤트를 캡처 할 수 있도록 최선의 방법을 찾고 있습니다.안드로이드의 순환 버퍼에 비디오 녹화

표준 비디오 녹화 API를 사용하면 파일에 직접 쓸 수 있으며 제한 (사용자가 설정하거나 SD 카드 용량)에 도달하면 녹화를 중지했다가 다시 시작해야합니다. 녹음이 실행되지 않는 최대 2 초 길이의 창을 만듭니다. 이것은 DailyRoads Voyager와 같은 일부 기존 앱이 이미 수행 한 것입니다. 중요한 것을 놓칠 가능성을 최소화하기 위해 10 분처럼 긴 시간으로 분할 시간을 설정할 수 있지만,이 시간 간격이 끝날 무렵 이벤트가 발생하면 처음 9 분 동안 아무 것도 저장하지 않으면 서 공간을 낭비하게됩니다.

내 생각은 다음과 같습니다. 버퍼로 사용할 큰 파일을 갖게됩니다. 프레임을 포착하고 파일에 직접 저장하여 끝에 래핑하는 코드를 사용하겠습니다. 사용자가 일부분을 유지하고자 할 때 버퍼의 시작과 끝 포인터를 표시합니다. 기록은 이전과 마찬가지로 계속 표시 될 수 있으며 보존으로 표시된 영역은 건너 뜁니다.

녹음이 중지되거나 백그라운드 스레드에서 (전화/카드 속도에 따라) 표시된 영역을 다른 파일로 복사하고 덮어 쓰기 방지 기능을 제거합니다.

위의 세부 정보가 마음에 들지 않는 경우 기본 질문 : 개별 프레임을 Android SDK의 비디오 파일로 변환하는 방법을 찾지 못하는 것 같습니다. 가능한가? 그렇지 않다면, 네이티브 코드에서 사용 가능한 라이브러리가 있습니까?

압축되지 않은 프레임의 큰 버퍼는별로 신경 쓰지 않지만 내 보낸 비디오는 Android 친화적 인 형식으로 압축해야합니다. 그러나 버퍼를 압축하는 방법이 있다면 그것에 대해 듣고 싶습니다.

감사합니다.

답변

8

Android의 MediaRecorder에는 출력을 지정하는 두 가지 방법이 있습니다. 하나는 파일 이름이고 다른 하나는 FileDescriptor입니다.

정적 방법 fromSocketParcelFileDescriptor 인 경우 소켓을 가리키는 ParcelFileDescriptor의 인스턴스를 만들 수 있습니다. 그런 다음 getFileDescriptor으로 전화하여 FileDescriptorMediaRecorder으로 전달되도록하십시오.

소켓에서 인코딩 된 비디오를 가져올 수 있으므로 (로컬 웹 서버를 만드는 것처럼) 비디오의 개별 프레임에 액세스 할 수 있습니다 (직접 해독 할 필요가 있기 때문에). 먼저.

+0

인코딩 된 비디오 스트림을 얻는 좋은 방법처럼 보입니다. 나는 그것이 어떻게 수행하는지 시도해야 할 것이다. 그러나 개별 프레임을 디코딩하는 것은 너무 많은 CPU를 사용하고 일부 전화기에서는 실시간 (인코딩 + 디코딩)이 아예되지 않을 수도 있습니다. 그래서 헤더 파일없이 원형 ​​파일 버퍼에 인코딩 된 스트림을 작성한다고 생각합니다. 그런 다음 내보내기 중에 인코딩 된 프레임을 헤더와 함께 패치하고 유효한 비디오 파일을 만듭니다. – lacop

+2

@albwq, 당신의 방법이 잘 작동 했습니까? – Felix

+2

데모 코드를 제공 할 수 있습니까? 매우 도움이 될 것입니다! =) –