我正在编写一个工具,可以找到适用于Mac和Windows的iTunes资料库的丢失文件.在Mac上,我可以通过使用精彩的"CatalogSearch"功能命名来快速查找文件.
但是,在Windows上,似乎没有用于按文件名搜索的OS API(或者是否存在?).
经过一些谷歌搜索,我了解到有一些工具(如TFind,Everything)直接读取NTFS目录并扫描它以按名称查找文件.
我想做同样的事情,但不必从头开始(虽然我过去写了很多磁盘工具,但我从来没有精力去挖掘NTFS).
我想知道是否有现成的库,可能是.dll,它会给我这个搜索功能:传入一个文件名,回到它的路径.
或者,Windows索引服务怎么样?至少当我在最近安装的XP Home系统上尝试此操作时," 开始"菜单下的" 搜索"操作实际上会扫描所有目录,这表明它没有完整的数据库.由于我根本不是Windows用户,我想知道为什么这不起作用.
最后,我需要的完整解决方案是:我有一个要查找的文件名列表,我需要搜索整个磁盘的代码(或者使用数据库)来一次性获取所有结果.例如,搜索不应该为我正在查找的每个文件启动新的完整扫描.这就是为什么我认为MFT方式是最优的,因为它可以快速迭代所有名称,将每个名称与我的列表进行比较.
对于我正在做的一些商业项目,我需要能够读取 $mft 文件中存储的实际数据。
我找到了一个可以提供帮助的gpl 库,但由于它是 gpl,我无法将其集成到我的代码中。
有人可以向我指出一个我可以使用的项目/或者向我指出相关的 Windows API(不需要 1000 行代码来实现的东西)
顺便说一句,为什么 Windows 不允许我直接读取 mft 文件?(通过创建文件和读取方法,如果我想毁掉我的驱动器,那是我的事而不是女士的事)。
谢谢。
在查看一个非常相似的问题并看到几乎相同的代码后,我决定分别提出这个问题.我想在DirectShow使用的默认窗口中显示网络摄像头视频流的视频预览,并且我还希望能够在任何给定时刻"拍摄"视频流.
我从MSDN上的DirectShow示例以及AMCap示例代码开始,并且我认为应该预览部分,但不是.我没有找到从视频流中抓取图像的例子,除了使用SampleGrabber,它已被弃用,因此我试图不使用它.
下面是我的代码,换行.请注意,EnumerateCameras中的大多数代码都已注释掉.该代码将用于附加到另一个窗口,我不想这样做.在MSDN文档中,它明确指出VMR_7创建自己的窗口来显示视频流.我的应用程序中没有错误,但此窗口永远不会出现.
我的问题是:我做错了什么?或者,如果您知道我想要做的一个简单示例,请将我链接到它.AMCap不是一个简单的例子,仅供参考.
注意:InitalizeVMR用于在无窗口状态下运行,这是我的最终目标(集成到DirectX游戏中).但是现在,我只想让它以最简单的方式运行.
编辑:此问题的第一部分,即预览相机流,已解决.我现在只是在寻找已弃用的SampleGrabber类的替代品,以便我可以随时拍摄照片并将其保存到文件中.
编辑:在谷歌搜索了近一个小时后,一般的共识似乎是你必须使用ISampleGrabber.如果您发现任何不同,请告诉我.
测试代码(main.cpp):
CWebcam* camera = new CWebcam();
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
MessageBox(NULL, L"text", L"caption", NULL);
if (SUCCEEDED(hr))
{
camera->Create();
camera->EnumerateCameras();
camera->StartCamera();
}
int d;
cin >> d;
Run Code Online (Sandbox Code Playgroud)
Webcam.cpp:
#include "Webcam.h"
CWebcam::CWebcam() {
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
//m_pTexInst = nullptr;
//m_pTexRes = nullptr;
}
CWebcam::~CWebcam() {
CoUninitialize();
m_pDeviceMonikers->Release();
m_pMediaController->Release();
}
BOOL CWebcam::Create() {
InitCaptureGraphBuilder(&m_pFilterGraph, &m_pCaptureGraph);
hr = m_pFilterGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaController);
return TRUE;
}
void CWebcam::Destroy() {
}
void CWebcam::EnumerateCameras() {
HRESULT hr = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用waveInOpen和co将声音录制到.wave文件中(请参阅此处)
这是我的代码记录到缓冲区,它似乎工作:
#include <Windows.h>
#include <MMSystem.h>
#include <iostream>
using namespace std;
int main(){
HWAVEIN microHandle;
WAVEHDR waveHeader;
const int NUMPTS = 22050 * 10; // 10 seconds
int sampleRate = 22050;
short int waveIn[NUMPTS]; // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types
MMRESULT result = 0;
WAVEFORMATEX format;
format.wFormatTag=WAVE_FORMAT_PCM; // simple, uncompressed format
format.wBitsPerSample=8; // 16 for high quality, 8 for telephone-grade …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 2 个视频合成为一个(也是音频)并另存为文件。比如说,在最终视频的左半部分显示源视频,在右侧显示其他源。任何编码都可以。不适用于 DirectShow。
我怀疑 IMFVideoMixerControl 可能与此有关,但不幸的是,我对 MF 太陌生,无法确定要采取的正确步骤来实现这一目标。如果您能给我一些指导,或者网络上有任何示例,请告诉我。感谢您的帮助。
我打开一个端口与设备通信并控制设备,但CreateFile()函数返回INVALID_HANDLE_VALUE.
GetLastError()返回2表示找不到指定的文件.
我的代码如下所示:
wsprintf( szPort, "COM%d", nPort );
m_hIDComDev = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if (m_hIDComDev == INVALID_HANDLE_VALUE)
{
DWORD err=GetLastError();
}
Run Code Online (Sandbox Code Playgroud)
为什么会出现这个问题?
尝试使用sws_scale将YUV420p转换为RGB24时,图像失真。
码:
ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
if (ret < 0) {
fprintf(stderr, "Error decoding video frame\n");
return ret;
}
if (*got_frame)
{
printf("video_frame%s n:%d coded_n:%d pts:%s\n",
cached ? "(cached)" : "",
video_frame_count++, frame->coded_picture_number,
"#"/*av_ts2timestr(frame->pts, &video_dec_ctx->time_base)*/);
/* copy decoded frame to destination buffer:
* this is required since rawvideo expects non aligned data */
av_image_copy(video_dst_data, video_dst_linesize,
(const uint8_t **)(frame->data), frame->linesize,
video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height);
/* write to rawvideo file */
fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
AVPicture pic;
avpicture_alloc( &pic, AV_PIX_FMT_RGB24, frame->width, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用我在网上找到的示例(不记得确切的来源)以编程方式从位图生成 AVI 文件。
这是我获取选项的代码
unsafe private void SetOptions() {
AVICOMPRESSOPTIONS opts = new AVICOMPRESSOPTIONS();
opts.fccType = 0; //fccType_;
opts.fccHandler = 541215044;//0;//fccHandler_;
opts.dwKeyFrameEvery = 0;
opts.dwQuality = 0; // 0 .. 10000
opts.dwFlags = 8;//0; // AVICOMRPESSF_KEYFRAMES = 4
opts.dwBytesPerSecond = 0;
opts.lpFormat = (System.IntPtr)0; //new IntPtr(0);
opts.cbFormat = 0;
opts.lpParms = (System.IntPtr)0; //new IntPtr(0);
opts.cbParms = 3232;//0;
opts.dwInterleaveEvery = 0;
AVICOMPRESSOPTIONS* p = &opts;
AVICOMPRESSOPTIONS** pp = &p;
IntPtr x = ps_;
IntPtr* ptr_ps = &x;
AVISaveOptions(0,0,1,ptr_ps,pp);
// TODO: AVISaveOptionsFree(...) …Run Code Online (Sandbox Code Playgroud) 在我的WPF项目中,我创建了一个包含多个MediaElements播放视频的视图.有时,在一个或所有MediaElements之间的任何地方都将无法播放分配给它们的视频,而是显示黑色矩形,或根本不显示.发生这种情况时不会发生MediaFailed事件.MediaOpened事件会在所有MediaElements上出现,即使他们不播放视频也是如此.
我已经为我的显卡安装了最新的驱动程序,这对此问题没有任何影响.
是否有一个程序可用于确保每个MediaElement始终如一地播放?
示例源代码如下.包含视频文件的完整示例项目位于github,网址为https://github.com/duggulous/MediaElementIssueExample
MainWindow.xaml
<Window x:Class="VideoDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="1920" Width="1080">
<Grid Name="rootContainer" Background="Pink">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="404" />
<ColumnDefinition Width="136" />
<ColumnDefinition Width="136" />
<ColumnDefinition Width="134" />
<ColumnDefinition Width="270" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="270" />
<RowDefinition Height="30" />
<RowDefinition Height="412" />
<RowDefinition Height="416"/>
<RowDefinition Height="526"/>
<RowDefinition Height="264"/>
</Grid.RowDefinitions>
<MediaElement x:Name="panel1" Margin="-1"
Grid.Column="0" Grid.Row="0"
Grid.ColumnSpan="2" Grid.RowSpan="2"
Source="media/1-ekg.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel2" Margin="-1"
Grid.Column="2" Grid.Row="0"
Grid.ColumnSpan="3" Grid.RowSpan="1"
Source="media/2-star.mp4"
MediaOpened="panel1_MediaOpened"
MediaFailed="panel1_MediaFailed"
MediaEnded="panel1_MediaEnded"/>
<MediaElement x:Name="panel3" Margin="-1"
Grid.Column="0" Grid.Row="2"
Grid.ColumnSpan="2" …Run Code Online (Sandbox Code Playgroud) 我把位图作为BYTE数组保存,它以微软CBitmap类的非常相似和可互换的格式保存每个像素的RGB值.所以让我们考虑一下我有一个CBitmaps数组,我想用MediaFoundation Transcode Api将它们转换为mp4,如下例所示:toMp4.但是在此示例中,它们从URL流式传输.
// Use the source resolver to create the media source
hr = pResolver->CreateObjectFromURL(pszURL, MF_RESOLUTION_MEDIASOURCE, NULL, &ObjectType, &pSource);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我的记忆中有我的位图.所以我相信我可以使用这个功能.IMFSourceResolver :: CreateObjectFromByteStream
我不确定这是否可行.总结如何使用转码api将我的CBitmap数组转换为mp4?