2013-02-22 2 views
1

IP 카메라에서 H.264 RTP 스트림을 처리합니다. 내가 사용하는 카메라는 각 I- 프레임을 여러 개의 NAL 단위로 나눕니다. 각 NAL 단위는 RTP 패킷으로 분할됩니다 (시작 및 끝 플래그는 프레임이 아닌 각 장치의 크기를 결정합니다).RTP 스트림에서 H.264 I- 프레임의 끝을 확인하십시오.

프레임 전송이 완료되고 압축을 풀 데이터가 충분한 지 어떻게 알 수 있습니까? 프레임은 여러 단위로 구성되므로 플래그를 사용하여 끝을 결정할 수 없습니다.

대부분의 카메라는 각 프레임을 플래그가 프레임의 시작과 끝을 결정하는 RTP 패킷으로 분할했습니다. 그래서 나는이 패킷에서 끝 플래그를 기다리는 데이터를 푸십시오 - 그리고 여기에 완전한 프레임이 있습니다.

나는이 카메라에서 얻을 NAL 단위의 순서는 다음과 같습니다

[NAL_UT_SPS] 시퀀스 파라미터 세트 +

[NAL_UT_PPS] 사진 파라미터 설정

[NAL_UT_SEI] 보충 개선 정보

[NAL_UT_IDR_SLICE] I- 프레임 사진 데이터의 부품 번호 1 번

[NAL_UT_IDR_SLICE] 파트 2의 1 번 즉 I 프레임의 화상 데이터

상기 I 프레임의

[NAL_UT_IDR_SLICE] 파트 # 3 화상 데이터

[NAL_UT_SLICE] 첫번째 P 프레임

[NAL_UT_SLICE] 2 P 프레임

[ NAL_UT_SLICE] 제 3의 P 프레임

...

이 서열로부터는 내가 [NAL_UT_SPS] + [NAL_UT_PPS] + [NAL_UT_SEI] + 3 * NAL_U을 결합 할 수 있다는 명백한 T_IDR_SLICE]를 최근에 디코더에 공급할 하나의 I- 프레임으로 변환합니다. 그러나 얼마나 많은 사진 데이터 부분을 결정할 수 있습니까? 시퀀스의 마지막 부분이 아닌 파트 #X를받은 시점을 어떻게 알 수 있습니까?

아이디어가 있으십니까?

답변

0

대부분의 H.264 디코더는 입력 스트림을 NAL로 받아들입니다. 까다로운 디코더가 없다면 - NAL을 디코더에 공급할 것입니다. 일반적으로 NAL : 프레임 또는 짝수 슬라이스간에 1 : 1 관계에 대한 보장은 없습니다.

+0

감사를 4 프레임

을 반환합니다. 사실 NAL 단위를 해당 프레임에 결합해야 할 필요가 있습니다. 필요한 것은 프레임에서 마지막 NAL 단위를 결정하는 방법에 대한 정보입니다. 이 카메라에서 얻은 데이터는 위의 편집 된 질문에 있습니다. – paft

2

나는이 문제를 해결했다.

용액이었다 (전체가 아닌 픽처 단위 (NAL_UT_SPS, NAL_UT_PPS, NAL_UT_SEI 위의 예에서) 및 포토 - 함유 패킷 (NAL_UT_IDR_SLICE, NAL_UT_SLICE)은 first_mb_in_slice 필드을 확인 프레임의 시작에 첨부되는 제 1 슬라이스의 화상 데이터에 대해서는 0이고, 제 2, 제 3에 대해서는 동일하지 않음).

그래서 first_mb_in_slice == 0이고 버퍼에 그림 데이터가 있으면이를 반환하고 버퍼에 새 프레임 데이터를 쓰거나 그렇지 않으면 프레임을 반환하지 않고 데이터를 추가합니다.이 방법으로 프레임 # 2를 수신하기 시작할 때 프레임 # 1을 반환하고 이전 프레임의 일부분이 아니라 새로운 프레임인지 확인할 수 있습니다.

[NAL_UT_SPS] 프레임 # 1 (I) 시작

는 [NAL_UT_PPS] 프레임 # 1이 계속

[NAL_UT_SEI] 프레임 # 1

는 [NAL_UT_IDR_SLICE] 프레임 # 1 화상 데이터, 제 1 번 계속 : first_mb_in_slice == 0

[NAL_UT_IDR_SLICE] 프레임 # 1 사진 데이터, Part # 2 : first_mb_in_slice> 0

[NAL_UT_IDR_SLICE] 프레임 # 1 화상 데이터, 제 3 : first_mb_in_slice> 0

는 [NAL_UT_SLICE] 프레임 # 2 (P)의 시작 : first_mb_in_slice == 0 <을 -이 시점에서, 우리는 첫 번째 프레임을 반환

는 [NAL_UT_SLICE] 프레임 # 3 (P)의 시작 : first_mb_in_slice == 0 < - 2 프레임 반품

는 [NAL_UT_SLICE] 프레임 # 4 (P)의 시작 : first_mb_in_slice == 0 < - 3 프레임 반품

는 [NAL_UT_SPS] 프레임 # 5 (I)는 <을 시작합니다 - 당신의 대답을 ...

+0

예, 이것은 AVPacket을 수동으로 만들 때 ffmpeg와 정확하게 작동합니다. 감사! – sarsonj