我正在尝试使用ffmpeg从 VIDBOX 设备录制视频/音频。使用 Windows 10 和ffmpeg版本 N-86129-g1e8daf3,执行时我可以正常看到和听到视频/音频
ffplay -f dshow -i video="VIDBOX NW07":audio="Microphone (VIDBOX NW07)"
Run Code Online (Sandbox Code Playgroud)
但是,当我执行时,我只录制黑屏(和正确的音频)
ffmpeg -f dshow -i video="VIDBOX NW07":audio="Microphone (VIDBOX NW07)" -c:v libx264 out.mp4
Run Code Online (Sandbox Code Playgroud)
是什么原因导致它在ffplay中工作但在ffmpeg 中不起作用?
所以Windows Mobile有DirectShow用于媒体编辑捕获,那么Symbian OS(s60 v5)的模拟是什么?
我发现了一些代码,可以让我访问网络摄像头的原始像素数据.但是我需要知道图像的宽度,高度,像素格式,最好是数据步幅(音高,内存填充或任何你想要调用它),如果它不是每个像素的宽度*字节之外的东西
#include <windows.h>
#include <dshow.h>
#pragma comment(lib,"Strmiids.lib")
#define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no);\
*(INT_PTR*)&c##_=*p; VirtualProtect(p, 4,PAGE_EXECUTE_READWRITE,&no); *p=(INT_PTR)c; }
// Here you get image video data in buf / len. Process it before calling Receive_ because renderer dealocates it.
HRESULT ( __stdcall * Receive_ ) ( void* inst, IMediaSample *smp ) ;
HRESULT __stdcall Receive ( void* inst, IMediaSample *smp ) {
BYTE* buf; smp->GetPointer(&buf); DWORD len = smp->GetActualDataLength();
//AM_MEDIA_TYPE* info;
//smp->GetMediaType(&info);
HRESULT ret = Receive_ ( inst, smp …Run Code Online (Sandbox Code Playgroud) 所以我正在尝试使用openCV videoWriter编写视频:
writer=cv.CreateVideoWriter(path+"test_output.avi",-1,fps,(W,H),1)
Run Code Online (Sandbox Code Playgroud)
因此,不是提供我提供的FOURCC -1,而是为了查看我可用的编解码器.结果是Microsoft RLE,Microsoft Video 1,Intel YUV和Uncompressed.
原因是当使用CMAKE为Visual Studio 10 x64配置openCV时,这就是我在视频i/o中所拥有的:视频I/O:DirectShow
有没有办法将其切换到FFMPEG?我知道ffmpeg dll存在于\ 3dparty\ffmpeg中.我找了Cmake FFMPEG标志,但没有找到任何标志.奇怪的是在视频部分下的opencv根目录中的CmakeLists.txt中:
if(UNIX AND NOT APPLE)
<FFMPEG stuff>
elseif(WIN32)
status(" Video I/O:" HAVE_VIDEOINPUT THEN DirectShow ELSE NO)
endif()
Run Code Online (Sandbox Code Playgroud)
所以在我看来opencv自动切换到DirectShow并且不允许使用FFMpeg.或者更确切地说,可以升级Driectshow以支持其他格式,如Divx或h264?有任何想法吗?
我有一个项目,其中一个函数使用 LPCOLESTR 类型的参数
HRESULT BuilGraph(IGraphBuilder *pGraph,LPCOLESTR dstFile)
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使用 argv[1] 并将其放入 dstFile 中,我尝试过:
LPCOLESTR somevar =OLESTR(argv[1]) ;
Run Code Online (Sandbox Code Playgroud)
感谢 Roman 和 Joachim,我对代码做了一些修改,现在看起来像这样: char pathstuff[50]; sprintf(pathstuff,"C:\Users\engine\Desktop\engine%s.avi",argv[1]);
所以我得到了路径视频名称,知道 argv[1] 将是一个数字,我如何将其转换为
LPCOLESTR ???
Run Code Online (Sandbox Code Playgroud)
它不起作用,任何想法如何解决这个问题。提前致谢。
使用Visual Studio 2015 RC和Windows SDK 7.1以及这个简单的DirectShow代码(带有COM的C++)
#include <dshow.h>
#include <iostream>
int main ()
{
CoInitialize(nullptr);
ICreateDevEnum* devEnum = nullptr;
CoCreateInstance(
CLSID_SystemClock,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum,
reinterpret_cast<void**>(devEnum)
);
IEnumMoniker* monikerEnum = nullptr;
devEnum->CreateClassEnumerator(
CLSID_VideoInputDeviceCategory,
&monikerEnum,
0
);
IMoniker* moniker = nullptr;
ULONG fetchedCount = 0;
while (monikerEnum->Next(1, &moniker, &fetchedCount))
{
IPropertyBag* propBag = nullptr;
moniker->BindToStorage(0, 0, IID_IPropertyBag, reinterpret_cast<void**>(propBag));
VARIANT var;
VariantInit(&var);
propBag->Read(L"FriendlyName", &var, nullptr);
std::cout << var.bStrVal;
VariantClear(&var);
}
}
Run Code Online (Sandbox Code Playgroud)
导致:
错误C2039:'bStrVal':不是'tagVARIANT'的成员
的tagVARIANT结构被定义为:
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT; …Run Code Online (Sandbox Code Playgroud)