2012-09-04 3 views
5

많은 캡처 된 이미지를 인코더 (FFmpeg) 표준으로 보내려고합니다.Process.StandardInput.BaseStream에 이미지를 빠르게 작성하는 방법

다음 코드 예제가 작동합니다.

CaptureScreen() 기능은 5-10ms의 이미지를 제공합니다.

이미지를 MemoryStream에 저장하면 거의 시간이 걸리지 않습니다.

그러나 나는 4535136 이미지를 proc.StandardInput.BaseStream에만 저장할 수 있습니다.

public void Start(string bitrate, string buffer, string fps, string rtmp, string resolution, string preset) 
{ 
    proc.StartInfo.FileName = myPath + "\\ffmpeg.exe"; 
    proc.StartInfo.Arguments = "-f image2pipe -i pipe:.bmp -vcodec libx264 -preset " + preset + " -maxrate " + bitrate + "k -bufsize " + 
    buffer + "k -bt 10 -r " + fps + " -an -y test.avi"; //+ rtmp; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.RedirectStandardInput = true; 
    proc.StartInfo.RedirectStandardOutput = true; 

    proc.Start(); 

    Stopwatch st = new Stopwatch(); 
    BinaryWriter writer = new BinaryWriter(proc.StandardInput.BaseStream); 
    System.Drawing.Image img; 

    st.Reset(); 
    st.Start(); 

    for (int z = 0; z < 100; z++) 
    { 
     img = ScrCap.CaptureScreen(); 
     img.Save(writer.BaseStream, System.Drawing.Imaging.ImageFormat.Bmp); 
     img.Dispose(); 
    } 

    st.Stop(); 
    System.Windows.Forms.MessageBox.Show(st.ElapsedMilliseconds.ToString()); 
} 

질문 :

내가 구원의 과정을 빠르게 할 수 있습니까?

나는 안정적인 60 FPS에게 여기 병목는 FFmpeg 속도가 느린 그것은을 .avi 압축 같은 속도로 데이터를 읽고 있다는 것입니다 이런 식으로

+0

'ImageFormat.png'을 사용해 보았는가? 그래서 실제로 쓰거나 읽는 데이터 양이 줄어 들었습니까? – PhonicUK

+0

나는 그것을 시험해 보았다. 그것도 더 느린 ... 130 MS – Hasibii

답변

2

를 얻을하려고합니다. 그래서 당신의 img.Save 메소드는 스트림의 버퍼에 데이터를 쓸 공간이 생길 때까지 블록됩니다.

할 수있는 일이 많지 않습니다. 실시간으로 60fps HD 비디오를 압축하려면 엄청난 처리 능력이 필요합니다.

+1

같은 것들이 속도를 ffmpeg 말할 방법이 무엇입니까? 나는 그것이 가능해야한다는 것을 의미한다. 왜냐하면 나는 과거에 60fps의 HD를 실시간으로 수행했기 때문에 ffmpeg는 7 %의 CPU 파워처럼 사용하고 있기 때문이다. – Hasibii

+1

체인을 막고있는 것을 찾아야합니다. 이미지 캡처? BMP로 인코딩 하시겠습니까? 그것을 ffmpeg로 보내시겠습니까? .avi로 압축? 결과 비디오를 하드 디스크에 기록 하시겠습니까? –

+0

그것이 ffmpeg로 보내 져야만합니다. 나는 bmp를 다른 스트림에 쓰려고 시도했지만 거의 시간이 걸리지 않았습니다. 명명 된 파이프를 사용하는 것이 더 빠를 수 있습니까? – Hasibii

관련 문제