2

Windows 10 빌드 10.1607.14393.10 (기념일 에디션)에서 더 이상 MJPG 캡처 스트림을 가져올 수 없습니다. MJPG와 YUY2 해상도로 사용되었지만 이제 IBaseFilter 소스가 연결되기 전에 DirectShow (Kernel Streaming) 및 Media Foundation MJPG에서 YUY2 만 NV12 방식으로 변환했습니다. 카메라가 다른 여러 시스템에서 시도했습니다. 어떤 아이디어가 잘못된 것일까 요? MMF에서웹캠 MJPG 캡처 스트림을 Windows 10에서 사용할 수 없습니다.

 640x480 @30 YUY2 
    ... 
    640x480 @30 MJPG <- gone 
... 
DirectShow: 
    com_t<IAMStreamConfig> sc; 
    if_failed_return_result(camera_output_pin->QueryInterface(&sc)); 
    int number_of_capabilities = 0; 
    int capability_size = 0; 
    if_failed_return(sc->GetNumberOfCapabilities(&number_of_capabilities, &capability_size), -1); 
    for (int i = 0; i < number_of_capabilities && k < count; i++) { 
     VIDEO_STREAM_CONFIG_CAPS scc; 
     assert(sizeof(scc) == capability_size); 
     AM_MEDIA_TYPE* mt = null; 
     if_failed_return(sc->GetStreamCaps(i, &mt, (BYTE*)&scc), -1); 
... 

:

640x480 @30 YUY2 
    ... 
    640x480 @30 NV12 // camera reports MJPG 4cc in USBView and KsStudio 

for (int i = 0; k < count; i++) { 
    com_t<IMFMediaType> type; 
    if (d->reader->GetNativeMediaType(VIDEO_STREAM, i, &type) != 0) { 
     break; 
    } 
    GUID guid_major_type = {0}; 
    if_failed_return_result(type->GetMajorType(&guid_major_type)); 
    if (guid_major_type == MFMediaType_Video) { 
     GUID guid_subtype = {0}; 
     if_failed_return_result(type->GetGUID(MF_MT_SUBTYPE, &guid_subtype)); 
     AM_MEDIA_TYPE* amMediaType = null; 
     if_failed_return_result(type->GetRepresentation(FORMAT_MFVideoFormat, (void**)&amMediaType)); 
     assert(amMediaType->cbFormat == sizeof(MFVIDEOFORMAT)); 
     const MFVIDEOFORMAT* mi = (const MFVIDEOFORMAT*)amMediaType->pbFormat; 
+0

Windows 업데이트. 같은 [MSDN 포럼에 Q] 참조 (https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/cdac5a0c-dfb4-4928-9ca9-2a63ec1496de/directshow-mjpeg-frame-type-in-usb-cameras-after-working-windows-10-anniversary-update-1607 포럼 : windowsdirectshow 개발) –

+0

나는 초기 개발자로서 몇 달 동안이나 보냈다. 도움이되지 않는다. 해결 방법이 필요하다. – Leo

+0

다음은이를 증명하는 코드이다 (msvc2012 명령 줄) https://github.com/leok7v/ uvc_mjpg_win10 – Leo

답변

3

explained by Mike M from Microsoft으로,

윈도우에서

So yes, MJPEG and H.264 being decoded/filtered out is the result of a set of features we needed to implement, and this behavior was planned, designed, tested, and flighted out to our partners and Windows Insiders around the end of January of this year. We worked with partners to make sure their applications continued to function throughout this change, but we have done a poor job communicating this change out to you guys. We dropped the ball on that front, so I’d like to offer my apologies to you all.

웹캠 10 주년 기념 업데이트 MJPG 비디오가 새로운 도우미 서비스 "윈도우 카메라 프레임 서버"에 의해 포착되는 "여러 대의 클라이언트가 카메라 장치에서 비디오 프레임에 액세스 할 수있게합니다"라는 자체 소개 기능을 제공합니다. Mike M이 언급했습니다.

TopoEdit의 두 번째 인스턴스로 카메라를 공유하는 여러 클라이언트를 볼 수 없어 일반적인 오류가 발생했습니다. 재생을 시작하는 동안 오류가 발생했습니다. 하드웨어 MFT가 하드웨어 리소스가 부족하여 스트리밍을 시작하지 못했습니다.

그러나 MJPG 및 H264 미디어 유형은 실제로 여러 클라이언트가 동일한 카메라에 동시에 액세스하고 각각이 자체적으로 노력을 복제하는 시나리오를 피하기위한 책임을 주장하므로 실제로 필터링되지 않습니다.

One of the main reasons that Windows is decoding MJPEG for your applications is because of performance. With the Anniversary Update to Windows 10, it is now possible for multiple applications to access the camera in ways that weren’t possible before. It was important for us to enable concurrent camera access, so Windows Hello, Microsoft Hololens and other products and features could reliably assume that the camera would be available at any given time, regardless of what other applications may be accessing it. One of the reasons this led to the MJPEG decoding is because we wanted to prevent multiple applications from decoding the same stream at the same time, which would be a duplicated effort and thus an unnecessary performance hit.

분명히이 "개선"은 많은 것을 놀라게했습니다.

업데이트. 아래 정의 된대로 레지스트리 값을 만들어 새로운 프레임 서버 기능을 사용하는 동작을 시스템 전체에서 비활성화 할 수 있음이 감지되었습니다. Media Foundation API가이 값을 확인하면 원래의 코드 경로를 선택하여 프레임 서버를 직접 우회하여 "하드웨어"(KS 프록시)와 통신합니다.

  • 키 이름 : 마이크로 소프트 \ 윈도우 미디어 재단 \ 플랫폼 \
    • HKEY_LOCAL_MACHINE \ 소프트웨어 (64 비트 응용 프로그램 32 비트 OS에서 32 비트 응용 프로그램)
    • HKEY_LOCAL_MACHINE \ 소프트웨어 \ WOW6432Node \ 마이크로 소프트 \ 윈도우 미디어 재단 \ 플랫폼 (64 비트 OS에서 32 비트 응용 프로그램)
  • 값 이름 : "EnableFrameServerMode"REG_DWORD
  • 값 : 0
  • 이 때문에
+0

"분명히이"개선 "이 놀랍게 많은 것을 잡았습니다."- 지금은 그렇지 않았습니다 .1 월 이후 내부자 빌드를하고 Microsoft는이 접근법의 결함에 대해 설명합니다. 현장에서 목소리가 들리지 않는 것 같습니다. ("개발자, 개발자, 개발자 !!!"- 모토를 기억 하는가?). 내 대답은 너무 오랫동안 주석에 대한 답변으로 붙여 넣기 때문에 여전히 측면에서 할 수있는 적절한 디자인의 힌트와 나는 Microsoft가 통찰력으로부터 이익을 얻을 수 있다고 생각하기 때문에. – Leo

1

대답은 나를 먼저 몇 가지 해결 방법을 명시하도록 해킹에서 고가의 개발에 이르기까지 존재

  1. (해킹) 원본 Windows 10, 그것은 힘의 부하 지연 링크에서 이전 mfcore.dll을 귀하의 지역 사본 - 이것은 해킹입니다 집에서 시도하지 마십시오 배송하지 마십시오.
  2. 잘 알려지지 않은 ksproxy.ax를 사용하거나 최신 대체 mfkproxy를 사용하여 카메라와 대화하기 위해 자신 만의 레이어를 구현하십시오.
  3. 스위치 WinUSB에 카메라와 "프레임 서버"의 적절한 설계에 이제 자신의 카메라 인터페이스

를 (Windows의 성숙 코드가 높지 성능이 아닌)/libuvc를 libusb를 사용하고 구현 :

우리는 또한 서버가 압축 해제 된 이미지, 압축 된 카메라 피드 (초당 총 1Gpixel에서 4 개), 얼룩 감지 정보 및 3D 포즈 삼각 측량 결과를 여러 클라이언트 (원격을 포함한 애플리케이션)에 압축하는 zSpace 시스템 설계의 프레임 서버를 보유하고 있습니다. 동시. 공유 메모리 및/또는 소켓을 사용하는 것은 C 코드의 몇 줄에 불과합니다. 나는 그것을 구현했으며 Windows와 Linux에서 작동합니다.

마이크로 소프트의 "개선"의 결핍은 고객의 요구에 무지 함을 의미하며 나는 쉽게 고칠 수 있다고 믿습니다.

인수를 위해서 카메라 스트림이 압축 된 형식 (MJPG/H.26x/HEVC/새로운 것일 수도 있음)이 더 좋다고 가정합니다.

하자 클라이언트의 몇 가지 종류가 있습니다 말 : (? 우리가 거기 트랜스 코딩 싶어) 원격 호스트의 네트워크에 원시 압축 된 데이터를 스트림

  1. 클라이언트가.
  2. 원시 압축 데이터를 로컬 또는 원격 영구 저장 장치 (하드 드라이브, ssd)에 저장하는 클라이언트. (우리는 거기에서 트랜스 코딩을 원합니까?)
  3. 원시 압축 데이터 스트림 분석 (사소한 것부터 복잡한 것까지)은 필요하지만 픽셀은 필요없는 클라이언트?
  4. 압축 된 데이터를 실제로 조작하고 업스트림을 전달하는 클라이언트 - 잘라 내기, 회전 등의 작업을 수행 할 수 있음을 기억하십시오. 완전한 압축 풀기가없는 JPEG.
  5. HSI 형식의 압축되지 않은 데이터가 필요한 클라이언트.
  6. 압축 해제 중에 적용된 일부 필터 (예 : 감마, 색상 프로파일)가있는 비 압축 데이터를 RGB 형식으로 필요로하는 클라이언트.

충분한가요? 오늘날 이들은 모두 NV12 (U (Cb) 및 V (Cr) 샘플의 절반의 대역폭면에서 실제로 더 큰 데이터 손실을 구성 함)를 얻습니다.

이제 Microsoft는 프레임 서버를 구현하기 때문에 데이터를 한 가지 또는 다른 방법으로 압축을 풀어야합니다. 이를 위해 압축되지 않은 데이터는 메모리에 저장되어야하며 일부 클라이언트가 데이터를 사용할 때 이점을 얻을 수 있으므로 (조건적으로) 거기에 보관할 수 있습니다. 최초의 미디어 그래프 디자인은 스플리터와 코딩 능력이 조금이라도있는 사람이라면 클라이언트 (싱크)가 부착 된 핀으로 데이터를 푸시하는 조건부 스플리터를 구현할 수 있습니다.

실제로 올바른 구현은 클라이언트 요구 사항을 고려해야합니다.이 정보는 이미 존재하며 모든 클라이언트에서 그래프 동작을 제어하는 ​​미디어 유형 협상 및 속성 방식으로 쉽게 사용할 수 있습니다. 그런 다음 필요할 때만 압축 풀기 및 기타 필터를 적용하여 CPU 캐시 지역에주의를 기울여 적절한 메커니즘을 통해 적절한 메모리에서 적절한 클라이언트에게 요청 된 데이터를 제공해야합니다. 그것은 앞서 언급 한 클라이언트와 그 이상을 혼합 한 잠재적 인 순열에서 모든 종류의 최적화를 허용합니다.

Microsoft가 거친 클래스의 응용 프로그램 및 서비스를 중단하는 대신 요구 사항 집합을 만족시키는 프레임 서버를 설계하고 구현하는 데 도움이 필요하면 - 질문 만하면됩니다.

Microsoft에서 Hollolens 입력을 네트워크 스트림으로 전환하려는 계획이 궁금합니다. NV12를 통해? 아니면 또 다른 해킹을 통해?

"개발자, 개발자, 개발자 ...":(자체가 잘못

관련 문제