2013-07-16 4 views
1

카메라에서 직접 captureOutput의 비디오 프레임을 처리하는 iOS 응용 프로그램이 있습니다. 처리의 일부로 다른 소스 파일에서 여러 C 함수를 호출하고 있습니다. UIImages를 원시 데이터로 변환하고이를 빠르게 전달합니다. 모든 처리는 비디오 출력에 연결된 대기열에서 수행됩니다.Objective-C에서 C 함수 호출 - 많은 양의 데이터 전달

이 부분은 정상적으로 작동하는 것 같습니다. 그것은 내가 지나가는 데이터가 너무 커지면 한계를 넘기고있는 것처럼 보이고 C 함수의 초기화 단계에서 갑자기 EXC_BAD_ACCESS 오류가 발생합니다. 초기화 란 작은 정적 배열을 선언하고 0으로 설정하는 것을 의미합니다.

대용량의 데이터를 전달하면서 스택 한계를 넘는다면 다른 링커 플래그와 -Wl, -stack_size를 사용하여 스택 크기를 늘리려고했는데 궁금한 점이 있었지만 차이가 나는 것 같지 않았습니다. .

비 UI 스레드에서 C 함수를 호출하는 방법에 대해 알아야 할 사항이 있습니까?

죄송하지만 일반적으로 코드를 게시 할 수 없으며 이러한 상황에 대한 일반적인 조언과 조언을 구하고 있습니다.

몇 가지 추가 정보 - 우리는 Objective-C의 비디오 처리 측면에서 메모리를 해제하고 자동 릴리즈 풀을 사용하는 데 문제가있었습니다 (다른 스레드와 마찬가지로 권장 됨). C 코드. 릴리스/해제가 C에서 실행되는 빈도를 늘리는 방법이 있습니까? 아니면 그냥 꼬리를 쫓고 있습니까?

+0

나는 그것이 목적 C.에서 C 함수에 큰 입력을 통과하는 문제를 반영하도록 게시물/질문의 제목을 편집하는 것이 좋습니다 것입니다그 외, 나는 제안 할 것이 아무것도 없다. ( –

+0

C/Objective-C의 성질에 문제가있는 것처럼 들리지 않는다. 어딘가에 나쁜 메모리 접근이있는 것처럼 들린다. –

+0

네, 추적하려고했습니다. 모든 메모리 문제와 응용 프로그램은 악기에 따라 메모리 (실제 및 가상)에서 안정적이며 메모리 경고를받지 않습니다. – FiddleMeRagged

답변

0

몇 가지 주요 영역 코드 주위에 여러 개의 @autoreleasepool 블록을 포함시킨 후 우리는 메모리 문제의 주요 원인을 확인했습니다.

catchOutput 콜백 함수 내에 다음 블록을 포함하는 것이 트릭을 수행 한 것처럼 보였습니다.

@autoreleaspool 
    { 
    imageColour = [self imageFromSampleBuffer:sampleBuffer]; 
    } 

참고 : imageFromSampleBuffer이 질문에서 찍은 ios capturing image using AVFramework

0

그래서 문제의 근원은 메모리 사용량입니다. 메모리를 낭비하지 않고 매우 조심 스럽더라도 iOS에 비디오 처리 응용 프로그램을 작성하는 것은 매우 까다 롭습니다. 메모리 사용으로 인해 OS가 응용 프로그램을 종료하기 전에 실제로 응용 프로그램에 할당 할 수있는 메모리가 너무 많기 때문입니다. 이 주제에 관한 내 블로그 게시물을 읽고 싶으면 video_and_memory_usage_on_ios에서 찾으실 수 있습니다. 기억하기 쉬운 몇 가지 규칙은 기본적으로 10MB의 메모리를 짧은 시간 동안 할당하고 사용할 수 있다는 것입니다. 그러나 그 이상인 경우 운영 체제를 혼란에 빠뜨릴 위험이 있으며 앱이 종료 될 수 있습니다. 파일에 가상 매핑 된 메모리가있는 경우 상한값은 한 번에 매핑 된 모든 메모리에 대해 약 700 megs입니다. 스택 문제가 아니며 힙 메모리에 대해 이야기하고 있습니다. 스택에 비디오 메모리를 두어서는 안되며, 그냥 미친 짓이다. 메모리에 대한 포인터를 전달할 때만주의하고, 한 버퍼에서 다른 버퍼로 메모리를 복사하지 마십시오. 버퍼의 메모리로 ref를 전달하십시오. CoreGraphics 및 CoreVideo의 iOS API는 이러한 유형의 "버퍼 할당 및 포인터 주위 전달"접근 방식을 지원합니다. 기억해야 할 또 다른 규칙은 한 번에 하나의 프레임 만 처리 한 다음 데이터가 파일에 기록 된 후 또는 AVAssets API를 통해 h.264 비디오에 기록 된 후 다음 프레임을 처리하기 위해 동일한 버퍼를 재사용하는 것입니다.

관련 문제