2017-12-28 78 views
0

video-toolbox를 사용하여 h264 스트림을 디코딩하는 iOS 앱을 만들고 있습니다. PC에서 ffmpeg로 스트림을 만들고 RTP를 사용하여 iPhone으로 전송합니다. 이 명령을 사용하여 만들 때 잘 작동합니다.-12909 인트라 리프레시가있는 h264 스트림 디코딩 오류가 발생했습니다.

ffmpeg -y -f:v rawvideo -c:v rawvideo -s 1280x720 -pix_fmt bgra -r 30 -an -i - -pix_fmt yuv420p -c:v libx264 -tune zerolatency -preset fast -b:v 5M -refs 1 -g 30 -profile:v high -level 4.1 -f rtp rtp://192.168.1.100:5678 

iPhone이 모든 프레임을 수신하여 표시합니다. 내가 사용할 때 그러나 VTDecompressionSessionDecodeFrame()가 호출 될 때

-intra-refresh 1 

디코딩 오류 코드 -12909 (시뮬레이터에 -8969) 실패 내를 새로 고침.

NAL 단위를 추출하기 위해 UDP 패킷을 처리하므로이 프로세스를 세 번 확인하고이 코드 부분에서 문제를 버렸습니다.

Video-toolbox는 인트라 새로 고침을 지원하지 않으므로 Video-toolbox가 인트라 새로 고침을 지원합니까? 그리고 만약 그렇다면, 나는 비디오 - 툴박스에 의해 지원되지 않는 스트림을 만드는 ffmpeg 쪽에서 뭔가를 놓치고 있습니까? CMVideoFormatDescriptionCreateFromH264ParameterSets()을 사용하여 SPS 및 PPS 데이터로 작성하는 것 외에 CMVideoFormatDescriptionRef에 뭔가를 추가해야합니까?

답변

0
  1. 예, 비디오 도구 상자가 지원하는 내가 알아 낸
  2. 아니,는 FFmpeg와는 아무 상관이
  3. 아니, CMVideoFormatDescriptionRef

와 특별한 아무것도 할 필요 없어 내 새로 고침 , SPS 및 PPS NALUs를 수신 할 때마다 새로 VTDecompressionSession을 생성 했으므로 디코더가 컨텍스트를 잃어 버리고있었습니다.

SPS 및 PPS 바로 뒤에 완전한 I 프레임이 수신되므로 이전 프레임의 컨텍스트가 필요하지 않으므로 새로 고침이 필요하지 않습니다.

인트라 리프레시가 활성화 된 경우 첫 번째 프레임 만 완전한 I 프레임이고 디코더는 이전 프레임의 컨텍스트를 사용하므로 동일한 VTDecompressionSession을 사용해야합니다.