2014-06-10 5 views
1

저는 라이브 프레임을 비디오로 변환하려고 주변에서 확인하고 있습니다. 그리고 라이브 프레임을 Video로 변환하는 (NReco.VideoConverter) ffmpeg lib를 찾았지 만 문제는 각 프레임을 ConvertLiveMediaTask (비동기 라이브 미디어 작업 변환)에 쓰는 데 시간이 걸리는 것입니다.C# 비디오로 라이브 프레임을 기록하는 가장 좋은 방법은 무엇입니까

IpCamera에서 (원본) 프레임 (1920x1080) (25fps)을 제공하는 이벤트가 있습니다. 프레임을 얻을 때마다 다음을 수행합니다.

//Image availbale event fired 
//... 

//... 
// Record video is true 
if(record) 
{ 
//////////////############# Time taking part ##############////////////////////// 
var bd = frameBmp.LockBits(new Rectangle(0, 0, frameBmp.Width, frameBmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);       
    var buf = new byte[bd.Stride * frameBmp.Height];      
    Marshal.Copy(bd.Scan0, buf, 0, buf.Length); 
    // write to ConvertLiveMediaTask 
    convertLiveMediaTask.Write(buf, 0, buf.Length); // ffMpegTask 
    frameBmp.UnlockBits(bd); 
////////////////////////////////////////////////////////////////////////////////// 
} 

위의 부분은 많은 시간이 걸리므로 프레임이 느슨합니다.

//Stop recording 
convertLiveMediaTask.Stop(); //ffMpegTask 

이 부분에서는 미디어를 파일로 저장하는 데 너무 많은 시간이 걸리기 때문에 BackgroundWorker를 사용했습니다.
내 질문은 어떻게 빠른 방법으로 ConvertLiveMediaTask에 프레임을 쓸 수 있습니까? 백그라운드에서 쓸 수있는 가능성이 있습니까? 제게 제안 해주세요.

답변

0

FullHD 해상도 (NReco.VideoConverter는 FFMpeg에 대한 래퍼)로 인해 대부분의 시간이 FFMpeg에 의한 인코딩 및 압축 (원시 코드 비트 맵을 h264 등으로 인코딩하는 경우)이 소요됩니다. FullHD의 실시간 인코딩은 매우 많은 CPU 사용 작업임을 알아야합니다. 컴퓨터가 그렇게 할 수 없다면 FFMPeg 인코딩 매개 변수로 재생 (비디오 화질/압축률 감소)하거나 CPU 자원이 덜 필요한 인코더를 사용해보십시오.

0

제한된 시간의 라이브 스트림을 녹화해야하는 경우 비디오 캡처 및 압축/저장을 두 개의 스레드로 분할 할 수 있습니다.

ConcurrentQueue를 사용하면 지연없이 한 스레드에 라이브 프레임 (대기열 대기열)을 버퍼링 할 수 있으며 다른 스레드는 대기열에서 이러한 프레임을 저장할 수 있습니다 (대기열에서 제외). 이렇게하면 프레임이 느슨해지지 않습니다.

분명히 RAM에 부담이 생기고 라이브 비디오를 중단 한 후에도 스레드 완료를 저장하는 동안 지연이 있습니다.