2

Apple 문서에서 Quicktime 프레임 워크는 OSX 10.9에서 AVFoundations 및 AVKit을 사용하도록 권장되지 않습니다. 내가 확신 할 수없는 이유 때문에 대부분의 문서에서는 Quicktime 프레임 워크 대체 기능 중 일부가 VideoToolbox라는 프레임 워크에서 다루어지고 있음을 언급하지 않습니다. 이 대체 기능에는 다른 것들 사이의 디코딩 및 압축 해제가 포함됩니다.h.264 데이터 패킷을 '실시간'재생/Apple의 VideoToolbox를 사용하여 미리보기

H.264로 인코딩 된 비디오 데이터 패킷 (NAL 패킷, TS 패킷 등)을 해독하고 압축을 풀고 픽셀 버퍼에 넣은 다음 코어 비디오와 OpenGL을 사용하여 비디오를 표시합니다

비디오 데이터 패킷을 받고 인코딩 박스에서 USB를 통해 가져옵니다. [AVCaptureDevice devices]을 실행하면이 상자가 표시되지 않습니다. 그래서 저는 AVFoundation (내 지식)의 대부분을 상자와 직접 인터페이스 할 수는 없습니다. 그러나 상자에 함께 제공되는 API가있어 비디오 데이터 패킷 파일에 액세스 할 수 있습니다. 디스크에 기록하고 퀵타임으로 재생할 수있는 비디오를 만들 수 있습니다. 그러나 실시간 재생을하는 것이 문제입니다. 따라서 디코딩, 압축 해제 및 픽셀 버퍼 생성과 관련하여 Core Video와 OpenGL을 사용할 수 있습니다.

픽셀 버퍼를 만들면 AVAssetWriterInputPixelBufferAdaptor을 사용할 수 있고 어떤 식 으로든이를 AVCaptureSession에 넣을 수 있습니다. 그렇게 할 수 있다면 OpenGL을 사용하지 않고 AVFoundations 및 AVKit에서 제공하는 도구를 사용할 수 있어야합니다.

또한 AVFoundations 설명서를 읽으면서 비디오/오디오 데이터 스트림에 대해 이야기 할 때마다 두 가지 중 하나에 대해 이야기하고 있습니다. AVCaptureDevice에서 오는 스트림 또는 HTTP 라이브 스트림에서 스트림을 처리하는 중 하나입니다. 전에 말했듯이 비디오 데이터 패킷을 생성하는 상자는 AVCaptureDevice으로 표시되지 않습니다. 그리고 필요하지 않으면 HTTP Live Streaming 서버를 구축/구현하지 않을 것입니다. (바라건대, 나는 사람들이 한 온라인을 보았지만 나는 할 필요가 없기를 바랍니다.)

어떤 도움이라도 대단히 감사하겠습니다.

감사합니다.

답변

9

오케이, 오랜 시간이 걸렸지 만, 원본 비 압축 및 인코딩 된 데이터 스트림에서 VideoToolbox를 올바르게 사용하는 방법을 알아 냈습니다.

기본적으로 나는 H264 사양에 익숙해야했으며 great post에서 많은 도움을 받았습니다. 여기

  1. 확인을하는 단계입니다 반드시 얻을 시퀀스 파라미터 세트 (SPS) 및 사진 파라미터 세트 (PPS)는 데이터 처리를 시작하기 전에.
  2. SPS 및 PPS를 사용하여 avcc 원자 헤더를 만드는 데 필요한 데이터를 가져옵니다. 위에 링크 된 게시물을 참조하십시오.
  3. NSData에 avcc 아톰 헤더를 저장하십시오.
  4. avcc atom을 사용하고 확장을 구성한 CMVideoFormatDescription을 만듭니다. CMVideoFormatDescription 제작 문서를 참조하십시오.
  5. 는 VTDecompressionSessionCreate에 사용됩니다 VTDecompressionOutputCallbackRecord
  6. 설정 pixelBufferAttributes을 설정합니다.
  7. CMVideoFormatDescription을 만드는 데 사용되지 않은 데이터에서 CMBlockBuffer를 만듭니다.CMBlockBufferCreateWithMemoryBlock을 참조하십시오. 기본적으로 SPS 또는 PPS가 아닌 기본 패킷 을 추가하려고합니다. 모든 패킷이 제대로 작동하려면 현재 nal 패킷크기를 추가해야 할 수도 있습니다. 다시 위의 링크를 참조하십시오.
  8. 는 CMBlockBuffer
  9. 이 디코딩을 할 VTDecompressionSessionDecodeFrame에 CMSampleBuffer
  10. 사용 CMSampleBuffer을 만듭니다.
  11. VTDecompressionSessionDefaultFrame 후에 VTDecompressionSessionWaitForAsynchronousFrames를 실행하십시오. VTDecompressionSessionWaitForAsynchronousFrames를 실행하지 않으면 디스플레이 출력이 불안정한 것으로 나타났습니다.
  12. 에 사용 된 함수에 대해 정의한 기능 중 VTDecompressionOutputCallbackRecord가 호출됩니다. 현재 은 OpenGL에 CVPixelBufferRef를 전달하여 화면에 비디오를 씁니다. 어쩌면 어떤 시점에서 AVFoundations를 사용하여 화면에 쓰려고 시도 할 것입니다.

이 정보가 도움이되기를 바랍니다.

+0

안녕하세요, 일부 소스 코드를 제공해주세요. – Jazzmanouch

+0

사과 개발자 계정을 갖고 계시다면 [이 게시물] (https://devforums.apple.com/message/959077#959077) – user2517182

+0

감사합니다. user2517182 :) – Jazzmanouch