user-0 提问: MCI播放音视频属于硬件解码吗？

回复:
user: user-1
content: 有些格式有专利的，如果需要使用或支持需要支付专利费的

user: user-1
content: 引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 gouyanfen 的回复:] 有些格式有专利的，如果需要使用或支持需要支付专利费的 平时用的那些免费软件不是几乎什么格式都支持吗？还有ffmpeg，不是也几乎支持所有格式吗，而且还开源[/quote] 这就看软件的许可协议了，MCI做为一种接口规范，他并不需要支持所有格式，他只需要规范化一种格式，成为一个标准就行了，MS为什么强大就是在为他的各种规范己经形成了一个行业标准，你不支持他就难以推广，所以很难撼动他的地位，并不代表他的规范就是最好的

user: user-0
content: 引用 7 楼 gouyanfen 的回复:有些格式有专利的，如果需要使用或支持需要支付专利费的 平时用的那些免费软件不是几乎什么格式都支持吗？还有ffmpeg，不是也几乎支持所有格式吗，而且还开源

user: user-0
content: 引用 5 楼 gouyanfen 的回复:[quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 3 楼 user-2 的回复:] 应该不是硬解码  mci是Media Control Interface的缩写，它只是一个媒体控制的接口标准，自己不能播放任何东西，它仅仅是完成控制，按需调用相应的驱动服务来完成。比如一般不支持mpeg4，但它支持COM技术，这样如果加入了相应的解码器就可以了支持mpeg4了 驱动不算硬解吗？我理解的软解应该是加载的dll文件之类的，那么驱动不应该算硬解吗？[/quote] 驱动也有可能是软解码，要看驱动的实现，比如驱动只是返回了硬件的某个调用指令就完成了解码那就是硬解码，反之就是软解码[/quote] 你是说，解码的最终是硬件才是硬解码，其余的都是软解码？所以mci的原理软硬解都有可能？既然有软解的话，那为啥支持的格式还那么有限？没道理呀。。。

user: user-1
content: 引用 4 楼 六道佩恩 的回复:[quote=引用 3 楼 user-2 的回复:] 应该不是硬解码  mci是Media Control Interface的缩写，它只是一个媒体控制的接口标准，自己不能播放任何东西，它仅仅是完成控制，按需调用相应的驱动服务来完成。比如一般不支持mpeg4，但它支持COM技术，这样如果加入了相应的解码器就可以了支持mpeg4了 驱动不算硬解吗？我理解的软解应该是加载的dll文件之类的，那么驱动不应该算硬解吗？[/quote] 驱动也有可能是软解码，要看驱动的实现，比如驱动只是返回了硬件的某个调用指令就完成了解码那就是硬解码，反之就是软解码

user: user-0
content: 引用 3 楼 user-2 的回复:应该不是硬解码  mci是Media Control Interface的缩写，它只是一个媒体控制的接口标准，自己不能播放任何东西，它仅仅是完成控制，按需调用相应的驱动服务来完成。比如一般不支持mpeg4，但它支持COM技术，这样如果加入了相应的解码器就可以了支持mpeg4了 驱动不算硬解吗？我理解的软解应该是加载的dll文件之类的，那么驱动不应该算硬解吗？

user: user-2
content: 应该不是硬解码  mci是Media Control Interface的缩写，它只是一个媒体控制的接口标准，自己不能播放任何东西，它仅仅是完成控制，按需调用相应的驱动服务来完成。比如一般不支持mpeg4，但它支持COM技术，这样如果加入了相应的解码器就可以了支持mpeg4了

user: user-0
content: 引用 1 楼 user-2 的回复:源码在windows_nt_4_source_code\private\mvdm\wow16\mmsystem\mci.c  DWORD WINAPI mciSendString(     LPCSTR lpstrCommand,     LPSTR lpstrReturnString,     UINT wReturnLength,     HWND hwndCallback     ) {     DWORD   dwErr32;     DWORD   dwErr16 = MMSYSERR_NOERROR;     LPSTR   lpstr;     BOOL    fHaveAll = FALSE;      // Initialize the 16-bit device list     if (!MCI_bDeviceListInitialized && !mciInitDeviceList()) {         return MCIERR_OUT_OF_MEMORY;     }      dwErr32 = mciMessage( THUNK_MCI_SENDSTRING, (DWORD)lpstrCommand,                           (DWORD)lpstrReturnString, (DWORD)wReturnLength,                           (DWORD)hwndCallback );      /*     ** Even if the string was processed correctly by the 32 bit side     ** we might still have to pass it through to the 16 bit side if it     ** contains the string " all\0" or " all ".     */     lpstr = _fstrstr( lpstrCommand, " all" );     if ( lpstr ) {          lpstr += 4;          if ( *lpstr == ' ' || *lpstr == '\0' ) {             fHaveAll = TRUE;         }     }       /*     ** If we have the all device or an error from the 32 bit side     ** we have to try the 16 bit side.     */      if ( !fHaveAll && dwErr32 == MMSYSERR_NOERROR ) {         return dwErr32;     }     else {          dwErr16 = mciSendStringInternal( lpstrCommand, lpstrReturnString,                                          wReturnLength, hwndCallback, NULL );     }       /*     ** Special processing of the return code is required if the     ** MCI_ALL_DEVICE_ID was specified.     */     if ( fHaveAll ) {         if ( (dwErr16 != MMSYSERR_NOERROR)           && (dwErr32 != MMSYSERR_NOERROR) ) {              return dwErr32;         }         else {             return MMSYSERR_NOERROR;         }     }      if ( dwErr32 != MCIERR_INVALID_DEVICE_NAME       && dwErr16 != MMSYSERR_NOERROR ) {           return dwErr32;     }      return dwErr16; }  我只是想知道这个属不属于硬解码。。。

user: user-2
content: 源码在windows_nt_4_source_code\private\mvdm\wow16\mmsystem\mci.c  DWORD WINAPI mciSendString(     LPCSTR lpstrCommand,     LPSTR lpstrReturnString,     UINT wReturnLength,     HWND hwndCallback     ) {     DWORD   dwErr32;     DWORD   dwErr16 = MMSYSERR_NOERROR;     LPSTR   lpstr;     BOOL    fHaveAll = FALSE;      // Initialize the 16-bit device list     if (!MCI_bDeviceListInitialized && !mciInitDeviceList()) {         return MCIERR_OUT_OF_MEMORY;     }      dwErr32 = mciMessage( THUNK_MCI_SENDSTRING, (DWORD)lpstrCommand,                           (DWORD)lpstrReturnString, (DWORD)wReturnLength,                           (DWORD)hwndCallback );      /*     ** Even if the string was processed correctly by the 32 bit side     ** we might still have to pass it through to the 16 bit side if it     ** contains the string " all\0" or " all ".     */     lpstr = _fstrstr( lpstrCommand, " all" );     if ( lpstr ) {          lpstr += 4;          if ( *lpstr == ' ' || *lpstr == '\0' ) {             fHaveAll = TRUE;         }     }       /*     ** If we have the all device or an error from the 32 bit side     ** we have to try the 16 bit side.     */      if ( !fHaveAll && dwErr32 == MMSYSERR_NOERROR ) {         return dwErr32;     }     else {          dwErr16 = mciSendStringInternal( lpstrCommand, lpstrReturnString,                                          wReturnLength, hwndCallback, NULL );     }       /*     ** Special processing of the return code is required if the     ** MCI_ALL_DEVICE_ID was specified.     */     if ( fHaveAll ) {         if ( (dwErr16 != MMSYSERR_NOERROR)           && (dwErr32 != MMSYSERR_NOERROR) ) {              return dwErr32;         }         else {             return MMSYSERR_NOERROR;         }     }      if ( dwErr32 != MCIERR_INVALID_DEVICE_NAME       && dwErr16 != MMSYSERR_NOERROR ) {           return dwErr32;     }      return dwErr16; }