2014-01-29 6 views
3

PES 역다 중화기에서 새로운 PES 패킷을 감지하고 packet_start_code_prefix (0x000001)를 검색합니다. 그것이 발생하면 PES_packet_length를 읽을 수 있으므로 바이트 스트림에서 현재 PES 패킷을 추출 할 수 있습니다. 그러나 그것이 H.264 비디오 스트림이면 PES_packet_length = 0이다.Mpeg2 PES 디멀티플렉서 : H.264 비디오 스트림으로 PES 패킷을 추출하는 방법은 무엇입니까?

그런 경우 PES 패킷을 추출하는 방법은 무엇입니까? 0x000001은 또한 H.264 단위 바이트 스트림에서 발생할 수 있으므로 다음 PES 패킷을 찾는 데이 접두사를 사용할 수 없습니다.

모든 H.264 PES 패킷에서 PES 패킷의 마지막 단위가 필러 데이터 (nal_unit_type = 12)임을 확인했습니다. 이 사실을 사용하여 현재 PES 패킷의 끝을 감지해야합니까?

+0

트랜스 포트 스트림입니까? 아니면 개별 PES 프레임에 액세스 할 수 있습니까? – szatmary

+0

예, 트랜스 포트 스트림이지만 TS 디멀티플렉서 이후입니다. TS 패킷 화가없는 일관성있는 PES 패킷 집합입니다. 비디오 패킷 만이 비디오 패킷입니다. – Harry

+0

이 패킷이 비디오 스트림이면 0이 될 수 있습니다 (https://en.wikipedia.org/wiki/Packeti 참조). zed_elementary_stream –

답변

9

일반적으로 아니오, 이것은 PES 패킷의 길이를 알지 못하면 불가능합니다. 그러나 H.264로 제한하기 때문에 운이 좋은 사고를 활용할 수 있습니다.

h.264 stream_id는 0xE0입니다. 첫 번째 nalu 비트는 항상 0이므로 000001E0은 부기 B 스트림 내에서 불법입니다. PES 헤더 뒤의 첫 번째 바이트는 이전 NALU의 꼬리 일 수 있으므로 반드시 부속서 b 시작 코드가 아니어야하므로 길이를 결정하기 위해 PES 헤더를 구문 분석해야합니다.

후회 용으로 보관하십시오. 단순히 시작 코드를 찾을 수 없으므로 패킷을 구문 분석해야합니다. 전송 스트림 인 경우 페이로드 단위 시작 표시기를 찾아 PES의 시작을 찾습니다. 그런 다음 사용 필드가 있으면 구문 분석 필드를 구문 분석하십시오. 이제 시작 코드 (이 경우에는 000001E0을 갖게됩니다.) 그런 다음 플래그를 살펴보십시오. 33 비트 PTS/DTS (재생을 위해 필요합니다)를 분석하고 선택적 필드를 건너 뜁니다 (PES 헤더의 플래그로 결정됨).) 이제 h.264 ES가 시작될 것입니다. 동일한 PID와 페이로드 유닛 시작 표시기가 false 인 모든 TS에 대해 프레임을 읽는 중입니다. 페이로드 단위 시작 표시기가 true가되면,

+0

문제는 TS demultiplexor 이후의 스트림이기 때문에 payload_unit_start_indicator가 없다는 것입니다. 바이트 스트림은 다음과 같습니다. – Harry

+0

00 00 01 E0 00 00 84 C0 0A 3F 61 0D 48 C9 1F 61 0B BC 29 00 00 00 01 09 30 00 00 00 01 06 00 01 C0 80 00 00 00 01 06 01 01 24 80 00 00 00 01 21 EA 5F FB 59 13 22 5F BB E2 F0 51 DE 00 83 5E ........... ..... 00 00 00 01 E0 00 00 84 C0 0A 3F 61 0D 02 79 1F 61 0B CA 39 00 00 00 01 09 50 00 00 00 01 06 00 01 C0 80 00 00 00 01 06 01 01 14 80 00 00 00 01 21 AA 9A FC 6A 51 11 ...... 필자의 경우 새로운 PES 패킷을 찾을 수있는 올바른 방법이 있습니까? – Harry

+0

답변을 업데이트 주셔서 감사합니다! 정말 좋은 해결책입니다. – Harry