문제

를 개설하고 싶은 작은 비디오 파일을 지도 모든 프레임에서 메모리(을 적용하는 일부 사용자 정의 필터).나는 원하지 않을 처리하는 비디오 코덱,오히려 보자는 라이브러리를 처리하는 위해요.

해봤을 사용하여 직접적으로 표시 SampleGrabber 필터를 사용하여(이 예제 http://msdn.microsoft.com/en-us/library/ms787867(VS.85).aspx어),하지만 나만 관리를 잡아 일부 프레임(지 프레임).나는 아주 새로운 비디오 프로그래밍 소프트웨어,어쩌면 나는 사용하지 않고 최고의 라이브러리,또는 난 잘못하고있다.

내가 붙여지는 부분의 코드(주로 수정된 복사/붙여 넣기에서 msdn 를 들어),불행히도 그렇지 않 grabb25 첫번째 프레임으로 예상되...

[...]

hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);

pControl->Run(); // Run the graph.
pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

// Find the required buffer size.
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);

for( int i = 0 ; i < 25 ; ++i )
{
    pControl->Run(); // Run the graph.
    pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

    char *pBuffer = new char[cbBuffer];
    hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer);

    AM_MEDIA_TYPE mt;
    hr = pGrabber->GetConnectedMediaType(&mt);
    VIDEOINFOHEADER *pVih;
    pVih = (VIDEOINFOHEADER*)mt.pbFormat;

    [...]
}

[...]

거기에 누군가와 함께,동영상 소프트웨어를 경험할 수 있는 조언에 대해 나호 또는 다른 간단한 라이브러리?

감사

편집:Msdn 링크를 작동하지 않는 것 같(보 bug)

도움이 되었습니까?

해결책

현재 이러한 가장 인기있는 비디오 프레임워크에 사용할 수 있 Win32 플랫폼:

  1. 비디오 윈도우:오래된 창문 틀에서 오는 세 미만의 Win95 하지만 여전히 널리 사용되기 때문에 사용하기 매우 간단합니다.불행하게도 그것을 지원합니 AVI 파일에는 적절한 비디오 포 윈도우 코덱이 설치되었습니다.

  2. DirectShow:표준 WinXP 프레임워크,그 수 있습니다 기본적으로 모두 로드 포맷을 재생할 수 있습으로 윈도우 미디어 플레이어입니다.를 사용하기 어려운.

  3. Ffmpeg:더 정확하게 위해 libavcodec 및 libavformat 함께 제공되는 Ffmpeg 를 열 근원 멀티미디어 유틸리티입니다.그것은 매우 강력하고 읽을 수 있는 형식을 많이(할 수 있는 거의 모든 것 재생 VLC)도 없는 경우에는 코덱 시스템에 설치되어 있습니다.그것은 매우 사용하기 복잡하지만 당신은 항상에서 영감을 얻의 코드입니다 오는 발송되 그것으로 또는 다른 구현에 오픈 소스 소프트웨어입니다.어쨌든 난 생각은 아직 많은 것보다 쉽게 사용 DS(그리고 훨씬 더 빠르게).그것은 필요하 comipled 여 MinGW,윈도우에서나 모든 단계가 아주 잘 설명 (이 순간에 있는 링크를 다운 희망이 죽지 않았).

  4. 퀵타임:Apple 프레임워크가 최고의 솔루션을 위해 윈도우 플랫폼을,이후 요구 퀵타임 앱을 설치하고 또한 적절한 QuickTime 코덱에 대한 모든 형식그것은 많은 형식을 지원하지 않지만,그것의 매우 일반적에서 전문적인 필드(그래서 어떤 코덱은 실제로만 퀵타임).너무 어렵게 구현할 수 있습니다.

  5. Gstreamer:최신 open source framework.난 그것에 대해 많이 알고,나는 그것 랩의 일부를 통해 다른 시스템(하지만).

이 모든 프레임워크로 구현되었습 백엔드에서 OpenCv Highgui 를 제외하고,DirectShow.기본 위한 프레임워크 Win32 의 사용 비디오 포 윈도우(따라서 수 있를 열기만 일부 AVI 파일)사용하려면 다른 사람 다운로드해야 합니다 CVS 신의 공식 출시하고 아직도 할 일부는 해킹에 코드고 그것이 어쨌든지 너무 완료되면,예를 들어 FFMPEG 백엔드하는 것을 허용하지 않에서 찾는다.를 사용하려면 퀵타임으로 OpenCV 당신을 도울 수 있습니다.

다른 팁

OpenCV 비디오 파일과 프로세스다.그것은 또한 편리해서 많은 종류의 비디오 처리를 포함하여 사용하는 컴퓨터 비전입니다.

사용"콜백"모델의 SampleGrabber 을 줄 수 있습니다 더 나은 결과입니다.예를 참조하십시오에서 샘플\C++\DirectShow\편집\GrabBitmaps.

거기에는 또한 많은 정보 Samples\C++\DirectShow\Filters\Grabber2\grabber_text.txt 고 readme.txt.

나는 그것에 매우 유혹에서는 C++로 적절한 고장의 비디오 파일을 다만 그것은 자신입니다.하지만 정보가가있다,그것은 긴 호흡 프로세스 구축 클래스를 모든 파일 형식으로 만들고,그것을 쉽게 변경할 수 있는 가 미래의 구조 변경 내용으로 계정을 솔직하게 그것은 그냥하지 않은 노력이 가치가 있습니다.

대신 내가 추천 ffmpeg.그것은 위에서 언급하지만,그것을 말하는 것은 어렵,그것은 어렵지 않습니다.더 많은 옵션이 대부분의 사람들 보다는 것이 필요하게 그것을 보는 것보다 더 어렵다.대부분의 작업할 수 있습자 ffmpeg 그것을 밖으로 작동합니다.

예를 들어,파일 변환 ffmpeg-i 입력 파일.mp4 파일.avi

결정 바로부터 시작 해야 하는 것 ffmpeg 작업 실행 스레드에서,또는 더 정확하게 스레드 라이브러리입니다.그러나 자신의 스레드 클래스를 포장할 수 있도록 당신은 당신의 자신의 EventAgs 와 방법을 확인하는 스레드가 완료됩니다.다음과 같습니다.-

ThreadLibManager()
{
  List<MyThreads> listOfActiveThreads;
  public AddThread(MyThreads);
}
Your thread class is something like:-
class MyThread
{
 public Thread threadForThisInstance { get; set; }
 public MyFFMpegTools mpegTools { get; set; }
}
MyFFMpegTools performs many different video operations, so you want your own event  
args to tell your parent code precisely what type of operation has just raised and 
event.
enum MyFmpegArgs
{
public int thisThreadID { get; set; } //Set as a new MyThread is added to the List<>
public MyFfmpegType operationType {get; set;}
//output paths etc that the parent handler will need to find output files
}
enum MyFfmpegType
{
  FF_CONVERTFILE = 0, FF_CREATETHUMBNAIL, FF_EXTRACTFRAMES ...
}

여기에 작은 조각의 제 ffmpeg 도구 클래스,이 부분에 대한 정보를 수집하오.나는 FFmpeg 특정 위치에,그 시작에서 소프트웨어의 실행하는 그것이있다.이를 위해 버전을 나가는 바탕 화면으로 이동,나는 상당히 확인 내가 쓴 경로를 정확하게 당신을 위해(내가 정말 싫어 MS 의 특별한 폴더스템,그래서 나는 그것을 무시로 내가 할 수 있습니다).

어쨌든,그것의 예를 사용하여 창 ffmpeg.

        public string GetVideoInfo(FileInfo fi)
    {
        outputBuilder.Clear();
        string strCommand = string.Concat(" -i \"", fi.FullName, "\"");
        string ffPath =   
  System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";
        string oStr = "";

        try
        {
            Process build = new Process();
            //build.StartInfo.WorkingDirectory = @"dir";
            build.StartInfo.Arguments = strCommand;
            build.StartInfo.FileName = ffPath;

            build.StartInfo.UseShellExecute = false;
            build.StartInfo.RedirectStandardOutput = true;
            build.StartInfo.RedirectStandardError = true;
            build.StartInfo.CreateNoWindow = true;
            build.ErrorDataReceived += build_ErrorDataReceived;
            build.OutputDataReceived += build_ErrorDataReceived;
            build.EnableRaisingEvents = true;
            build.Start();
            build.BeginOutputReadLine();
            build.BeginErrorReadLine();
            build.WaitForExit();


            string findThis = "start";
            int offset = 0;
            foreach (string str in outputBuilder)
            {
                if (str.Contains("Duration"))
                {
                    offset = str.IndexOf(findThis);
                    oStr = str.Substring(0, offset);
                }
            }
        }
        catch
        {
            oStr = "Error collecting file information";
        }

        return oStr;
    }
    private void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        string strMessage = e.Data;
        if (outputBuilder != null && strMessage != null)
        {
            outputBuilder.Add(string.Concat(strMessage, "\n"));
        }
    } 

사용하십시오 OpenCV 라이브러리입니다.그것은 확실히이 있는 능력이 필요합니다.

이 가이드 섹션에 대한 액세스 프레임에서는 동영상 파일입니다.

의 경우를 AVI 파일 내가 읽기 데이터를 AVI 파일 자신과 추출 프레임이 있습니다.이 비디오 압축 관리자를 압니다.

AVI 파일 형식은 매우 간단한 참조하십시오: http://msdn.microsoft.com/en-us/library/dd318187(VS.85).aspx (고용).

이 있으면 파일을 열고 당신은 단지 추출 각 프레임에 전달하 ICDecompress()압축을니다.

그것은 많은 것 같지만 그것은 가장 신뢰할 수 있는 방법입니다.

는 경우에는 너무 많은 일,또는 당신이 원하는 경우보다 더 많은 AVI 파일 다음 사용하 ffmpeg.

OpenCV 최고의 솔루션입니다면 비디오 당신의 경우에만 필요하로 이어질 시퀀스의 사진.If you're willing to 오 비디오 처리,비디오 같음"비주얼 오디오",당신이 필요하다가 트랙을 가진 사람에 의해 제공되"martjno".새로운 윈도우 솔루션도에 대한 Win7 는 3 개의 새로운 가능성을 또한:

  1. Windows Media Foundation:후계자의 DirectShow;청소-최대 인터페이스
  2. Windows Media Encoder9:하지 않지만 포함 프로그램,그것은 또한 선박은 라이브러리에 대한 코딩
  3. Windows 식이 4:의 후계자 2.

지난 2 는 상업 단지 해결책이 있을 수도 있겠지만,처음 하나는 무료입니다.코드 WMF,you need to Windows SDK 를 설치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top