2009-04-28 3 views
2

ASF 작성기를 사용하여 RAW AVI 파일을 WMV로 압축하고 있습니다. 저는 압축을 더 빨리해야 할 필요가 있습니다. 어떤 힌트가 있습니까 & 어떻게 이것을 달성하는 가장 좋은 방법? 인덱서의 영향을 줄이거 나 낮 춥니 다? 어떤 숨겨진 압축 매개 변수?ASF Writer를 사용하여 WMV 압축을 더 빠르게 만드는 방법은 무엇입니까? 어떤 힌트?

파일에는 RGB/24bits 형식의 비디오 만 포함되며 비디오 스트림의 압축 수준은 200kbps와 2000kbps 사이입니다. 여기

(C++, C#을, 델파이 등을 사용)

모든 구성 힌트는 WMV 작가를 구성하는 것이 (DSPack 사용) 코드의 일부입니다.

function CreateWMVWriter(VideoQuality, AudioQuality: Cardinal; videoInfo: PVideoInfoHeader; audioInfo: PWaveFormatEx; hasAudio: Boolean): IBaseFilter; 
const 
    PROFILE_NAME = 'WMV AutoProfile'; 
    // BUFFER_WINDOW = $FFFFFFFF; // auto buffer 
    BUFFER_WINDOW = 1000; // 1 second 
    MAX_KEY_FRAME_SPACING = 10000000; // 1 seconds 
var 
    configWriter : IConfigAsfWriter; 
    profileManager : IWMProfileManager; 
    profile : IWMProfile; 
    stream : IWMStreamConfig; 
    mediaProps : IWMMediaProps; 
    vmediaProps : IWMVideoMediaProps; 
    pmt : PWMMediaType; 
    msize : Cardinal; 
    vih : PVideoInfoHeader; 
    wfe: PWaveFormatEx; 
    hr : HRESULT; 
    videoBitRate, audioBitRate: Cardinal; 
    width, height: Integer; 
begin 
    videoBitRate := VideoQuality * 1000; // kbits 
    // create the profile 
    CheckDSError(WMCreateProfileManager(profileManager)); 
    CheckDSError(profileManager.CreateEmptyProfile(WMT_VER_9_0, profile)); 
    CheckDSError(profile.SetName(StringToOleStr(PROFILE_NAME))); 
    CheckDSError(profile.SetDescription(StringToOleStr(PROFILE_NAME))); 
    CheckDSError(profile.CreateNewStream(WMMEDIATYPE_Video, stream)); 
    CheckDSError(stream.SetStreamName(StringToOleStr('Video'))); 
    CheckDSError(stream.SetBitrate(videoBitRate)); 
    CheckDSError(stream.SetBufferWindow(BUFFER_WINDOW)); 
    // config video media type 
    stream.QueryInterface(IID_IWMMediaProps, mediaProps); 
    CheckDSError(mediaProps.GetMediaType(nil, msize)); 
    GetMem(pmt, msize); 
    CheckDSError(mediaProps.GetMediaType(pmt, msize)); 
    with pmt^ do 
    begin 
    majortype := WMMEDIATYPE_Video; 
    subtype := WMMEDIASUBTYPE_WMV3; 
    bFixedSizeSamples := True; 
    bTemporalCompression := True; 
    pUnk := nil; 
    vih := PVideoInfoHeader(pbFormat); 
    // copy video info header (the same as with the original - copy: rcSource, rcTarget, AvgTimePerFrame, biWidth, biHeight) 
    CopyMemory(vih, videoInfo, SizeOf(TVideoInfoHeader)); 
    // set bit rate at the same value 
    vih.dwBitRate := videoBitRate; 
    // set new compression ('WMV3') 
    vih.bmiHeader.biCompression := MAKEFOURCC('W', 'M', 'V', '3'); 
    end; 
    CheckDSError(mediaProps.SetMediaType(pmt)); 
    FreeMem(pmt, msize); 
    // set media props 
    stream.QueryInterface(IID_IWMVideoMediaProps, vmediaProps); 
    CheckDSError(vmediaProps.SetQuality(100)); 
    CheckDSError(vmediaProps.SetMaxKeyFrameSpacing(0)); 
    // CheckDSError(vmediaProps.SetMaxKeyFrameSpacing(MAX_KEY_FRAME_SPACING)); 
    // add video stream 
    CheckDSError(profile.AddStream(stream)); 
    // add audio stream (if needed) 
    if hasAudio then 
    begin 
    CheckDSError(profile.CreateNewStream(WMMEDIATYPE_Audio, stream)); 
    CheckDSError(stream.SetStreamName(StringToOleStr('Audio'))); 
    audioBitRate := audioInfo.nSamplesPerSec * audioInfo.nChannels * audioInfo.wBitsPerSample; 
    CheckDSError(stream.SetBitrate(audioBitRate)); 
    CheckDSError(stream.SetBufferWindow(BUFFER_WINDOW)); // auto 
    // config video media type 
    stream.QueryInterface(IID_IWMMediaProps, mediaProps); 
    CheckDSError(mediaProps.GetMediaType(nil, msize)); 
    GetMem(pmt, msize); 
    hr := mediaProps.GetMediaType(pmt, msize); 
    with pmt^ do 
    begin 
     // uncompressed audio 
     majortype := WMMEDIATYPE_Audio; 
     subtype := WMMEDIASUBTYPE_PCM; 
     formattype := WMFORMAT_WaveFormatEx; 
     cbFormat := sizeof(TWaveFormatEx); 
     bFixedSizeSamples := True; 
     bTemporalCompression := False; 
     lSampleSize := audioInfo.nChannels * audioInfo.wBitsPerSample div 8; 
     pUnk := nil; 
     wfe := PWaveFormatEx(pbFormat); 
     // copy video info header (the same as with the original) 
     CopyMemory(wfe, audioInfo, SizeOf(TWaveFormatEx)); 
    end; 
    CheckDSError(mediaProps.SetMediaType(pmt)); 
    FreeMem(pmt, msize); 
    // add video stream 
    CheckDSError(profile.AddStream(stream)); 
    end; 

    // create the writer 
    Result := AddFilterGUID(CLSID_WMAsfWriter, 'WmvWriter'); 

    // config the writer 
    configWriter := Result as IConfigAsfWriter; 
    CheckDSError(configWriter.SetIndexMode(True)); 
    CheckDSError(configWriter.ConfigureFilterUsingProfile(profile)); 
end; 

답변

0

난 정말이 경험을 많이 가지고 있지만, 다른 곳에 게시 된 내용 대신 WMMEDIASUBTYPE_WVC3WMMEDIASUBTYPE_WVC1를 설정하는 시도에서하지 않습니다. 정보는 here에서 수집되었습니다.

기타 유용한 링크 : herehere

관련 문제