2013-05-05 224 views
3

我正在嘗試使用libVLC作爲運動檢測項目的視頻解碼器。以前我使用的是ffmpeg庫,但Matroska文件的一些問題將我帶到了這裏。除了以正確的速度播放視頻外,我還希望能夠以我係統可以處理的最快速度獲得一幀又一幀,因爲一旦用戶設置了一些參數,我希望運動檢測算法能夠通過視頻儘可能快。我libVLC設置代碼看起來像這樣(錯誤處理和微小的細節略去了):使用libVLC作爲視頻解碼器

const char* vlc_argv[] = 
{ 
    "--no-audio", /* skip any audio track */ 
}; 
libvlc_instance_t* inst = libvlc_new(sizeof(vlc_argv)/sizeof(*vlc_argv), vlc_argv); 
auto media = libvlc_media_new_path (inst, filename.c_str()); 
player = libvlc_media_player_new_from_media(media); 
libvlc_media_release(media); 

// Needed to initialize the player ? 
libvlc_media_player_play(player); 
libvlc_media_player_pause(player); 

fps = libvlc_media_player_get_fps(player); 
length = libvlc_media_player_get_length(player); 
width = libvlc_video_get_width(player); 
height = libvlc_video_get_height(player); 

// TODO: Add libvlc_video_set_callbacks to set up callbacks to render to memory buffer 

不過,我留下了以下問題:

  1. 有初始化一個更簡單的方法媒體播放器除了撥打libvlc_media_player_play,然後libvlc_media_player_pause
  2. 所有的get函數(fps, length, width, height)都返回零。我是否需要做一些事情來閱讀第一幀來獲取這些值,如果是的話,我該怎麼知道我的解碼幀緩衝區有多大?
+0

嗨,只是想知道,你在哪個操作系統? – 2013-07-02 15:12:35

+0

這是在Windows中完成的,但我運行的是Linux和Windows。 – 2013-07-02 15:57:52

+0

您可以使用代碼轉換來訪問未佔用的幀。這是我的代碼:https://github.com/aleksas/libvlc-stream-grabber/blob/master/source/VlcStreamGrabber.cpp。 – alex 2017-01-10 11:55:00

回答

3

From a VLC developer

  1. 常規播放系統真的不是意味着unpaced解碼。您需要使用流輸出,目前還沒有可編程API。

  2. get調用返回零,因爲您需要等待直到軌道創建。

+0

'等到軌道被創建'這是什麼意思 – Zigma 2014-07-30 10:52:35

+0

是否與以下內容相同:http://stackoverflow.com/q/24924766/2179864 – Zigma 2014-07-30 11:04:07