2014-09-26 6 views
0

NVENC SDK을 사용하여 OpenGL 프레임을 인코딩하고 RTSP를 통해 스트리밍합니다. NVENC는 여러 NAL 단위로 인코딩 된 데이터를 제공합니다. Live555로 스트리밍하려면 start code (0x00 0x00 0x01)을 찾아서 제거해야합니다. 이 작업을 피하고 싶습니다.NVENC를 사용하여 시작 코드를 제거 할 수 있습니까?

NVENC에는 내가 참조 할 수있는 sliceOffset 속성이 있지만 NAL 단위가 아니라 슬라이스를 나타냅니다. 실제 데이터가 시작되는 SPS 및 PPS 헤더의 끝만 가리 킵니다. 슬라이스가 NAL과 같지 않다는 것을 이해합니다 (틀린 경우 정확하게 수정합니다). 인코딩 된 데이터에 대해 이미 단일 조각이 필요합니다.

다음 중 가능한 것이 있습니까?

  1. 포스 NVENC 인코딩 개별 NAL 단위
  2. 포스 NVENC 각 인코딩 된 데이터 블록의 NAL 단위
  3. 이 Live555는
+0

NVEnc를 사용하여 OpenGL 프레임을 전송하면 이미 달성 한 작업을 수행하려고합니다. CUDA interop을 사용하고 있습니까, 아니면 더 좋은 방법이 있습니까? 어떤 포인터 주셔서 감사합니다! – JPNotADragon

+0

가장 좋은 방법은 CUDA interop이지만 아직 완료하지 않았습니다. FBO로 렌더링하고, 데이터를 RAM으로 전달한 다음 다시 NVENC 표면으로 전달합니다.CUDA 샘플에는 FBO에서 직접 보내는 방법에 대한 리소스가 있어야합니다. –

+0

고마워요. @chuckleplant, 한번보세요. 제가 지금까지 가지고있는 유일한 것은 오슬로 대학에서 행해진 매우 흥미있는이 논문입니다 : http://heim.ifi.uio.no/paalh/students/MartinAlexanderWilhelmsen.pdf – JPNotADragon

답변

1

가있는 것 같다 스트리밍 시퀀스 매개 변수를 허용합니다 어디에 나타냅니다 RTSP/RTP를 통해 H.264를 수행하려는 모든 사람이이 질문에 이르는 시점이되어야합니다. 여기에 내 두 센트가 있습니다 :

1) 접근 단위의 개념이 있습니다. 액세스 유닛은 인코딩 된 프레임을 나타내는 NAL 유닛 세트 (하나 일 수도 있음)입니다. 그것은 당신이 일해야하는 논리의 수준입니다. 인코더가 개별 NAL 단위를 제공한다고 말하면 인코딩 절차로 인해 하나의 원본 프레임 (예 : SPS + PPS + 코딩 된 그림)의 NAL 단위가 여러 개 발생하는 경우 어떤 동작이 기대됩니까? 즉, 액세스 단위에서 NAL 단위의 수를 줄이기 위해 엔코더를 구성하는 방법이 있습니다 (예 : AUD NAL을 포함하지 않고 SPS/PPS를 반복하지 않고 SEI NAL을 제외) - 실제로이 지식으로 무엇을 알 수 있습니까? 예상치와 종류의 인코더가 프레임 당 단일 NAL을 제공하도록 강요합니다 (물론 이것은 모든 프레임에서 작동하지 않지만 디코더에 대한 지식으로 처리 할 수 ​​있습니다). 나는 NVENC API에 대한 전문가가 아니며 방금 사용하기 시작했습니다. 적어도 Intel Quick Sync에 대해서는 AUD, SEI를 끄고 PPS/SPS의 반복을 비활성화하면 프레임 당 약 1 NAL이 필요합니다. 프레임 2 ... N.

2) 내가 API에 익숙하지 않다고 언급 했으므로 답변을 드릴 수 없지만이 문제는 매우 의심 스럽습니다.

3) SPS와 PPS는 첫 번째 액세스 단위 (인코더에서 가져온 첫 번째 비트 스트림)에 있어야하며 비트 스트림에서 올바른 NAL을 찾아 추출하거나 특수 API 호출을 사용하여 인코더에서 가져옵니다.

실제로 비트 스트림을 통해 실행하고 시작 코드를 구문 분석하고 NAL 장치를 추출하여 하나씩 Live555에 공급하는 것은 어렵지 않다고 생각합니다. 물론, 인코더가 AVCC 형식의 비트 스트림을 출력하도록 제안하는 경우 (시작 코드 또는 부록 B와 비교하여 NAL 단위 사이에 인터리브 된 길이 값을 사용하므로 접두어를 찾지 않고 다음 코드로 건너 뛸 수 있음) 그런 다음 사용해야합니다. RTP는 RTSP의 경우 전송 인프라의 오버 헤드가 크고 FU-A 패킷 화에 대한 적절한 지원이없는 GStreamer에 불운을 겪었 기 때문에 전송 자체를 구현하기가 쉽습니다. Live555와 같은 타사 라이브러리를 사용하는 것이 합리적입니다.

+0

비트 스트림을 통해 끝났지 만 (2) 스트리밍에 도움이 될 것이라고 생각하는 인코더가하는 것이 합리적 일 것이라고 생각합니다. 감사! –

+0

음, AVCC 형식도 이것을 제공합니다. 따라서 NAL 단위의 오프셋을 지정하는 다른 인코더 특정 API가 실제로 필요하지 않습니다. 모든 인코더가 지원하지 않는 것은 부끄러운 일입니다. –