VLCのライブラリです。
libVLCのライセンスはLGPLですが、モジュールによってはGPLv2やそれ以降のものもあります。May I redistribute libVLC in my application? - Frequently Asked Questions - VideoLAN Wiki
個々のモジュールのライセンスはVLCのソースコードのmodulesフォルダ以下にあるソースのコメント部で確認でき、そこに「under the terms of the GNU General Public License」の記述があるならばGPLです。plugins license - The VideoLAN Forums
Visual Studioから使用する場合について考えます。
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <vlc/vlc.h> int main() { /* VLCエンジンを読み込む */ libvlc_instance_t* instance = libvlc_new(0, NULL); /* 新しい項目を作成する */ libvlc_media_t* media = libvlc_media_new_path(instance, "path/sample.mp3"); // ファイルパス (相対パス) // media = libvlc_media_new_path(instance, "C:\\path/sample.mp3"); // ファイルパス (絶対パス) // media = libvlc_media_new_location(instance, "http://example.com/sample.mp3"); // URL /* メディアプレーヤーの再生環境を作成する */ libvlc_media_player_t* media_player = libvlc_media_player_new_from_media(media); /* メディアを保持する必要がなくなったため、メディアの参照カウントを減少させる */ libvlc_media_release(media); /* メディアプレーヤーを再生する */ libvlc_media_player_play(media_player); /* 待機する */ while (libvlc_state_t::libvlc_Ended != libvlc_media_player_get_state(media_player)) { Sleep(10); } /* 再生を止める */ libvlc_media_player_stop(media_player); /* メディアプレーヤーを解放する */ libvlc_media_player_release(media_player); libvlc_release(instance); return 0; }LibVLC Tutorial - VideoLAN Wiki
コンパイル時に「error C2065: 'libvlc_media_read_cb': 定義されていない識別子です。」として失敗するときには、vlc.hの読み込み前に
typedef SSIZE_T ssize_t;
としてSSIZE_Tを宣言します。 Problem when including "vlc.h" file to c++ win32 - The VideoLAN Forums c - Why ssize_t in Visual Studio 2010 is defined as unsigned? - Stack Overflow
再生するのが動画ならば、再生前にウィンドウ ハンドルをメディアプレーヤーに設定し、再生を開始させるために制御を戻します。
libvlc_media_player_set_hwnd(media_player, hWnd);
/* メディアプレーヤーを再生する */
libvlc_media_player_play(media_player);
LibVLCのインスタンスを作成し初期化できます。
libvlc_instance_t* libvlc_new( int argc, // 引数の数 const char *const *argv // 引数のリスト (VLC media playerへ渡すコマンドと同じ) );libvlc_new() - VLC: LibVLC core
int libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, // unsigned num, // ビデオ出力の数 const char *psz_filepath, // スクリーンショットを保存するパス unsigned int i_width, // unsigned int i_height // );libvlc_video_take_snapshot() - VLC: LibVLC video controls
psz_filepathでフォルダを指定した場合には、ファイル名は日時となります。
libvlc_instance_t* pInstance = libvlc_new(0, NULL); libvlc_media_t* pMedia = libvlc_media_new_path(pInstance, "C:\\sampl.mp4"); libvlc_media_player_t* pMediaPlayer = libvlc_media_player_new_from_media(pMedia); libvlc_media_release(pMedia); libvlc_media_player_play(pMediaPlayer); Sleep(500); // 再生の開始を待つ libvlc_media_player_set_position(pMediaPlayer, 0.5); Sleep(500); // シークの完了を待つ int result = libvlc_video_take_snapshot(pMediaPlayer, 0, "C:\\", 0, 0); libvlc_media_player_stop(pMediaPlayer); libvlc_media_player_release(pMediaPlayer); libvlc_release(pInstance);git.videolan.org Git - vlc.git/blob - doc/libvlc/vlc-thumb.c
VLCによって読み込まれた映像と音声のデータを処理できます。
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <vlc/vlc.h> uint8_t* audioBuffer = NULL; uint8_t* videoBuffer = NULL; unsigned int audioBufferSize = 0; unsigned int videoBufferSize = 0; unsigned int videoWidth = 0; unsigned int videoHeight = 0; void AudioPrerenderCallback(void* pUserData, uint8_t** ppPcmBuffer, size_t size) { // TODO: ミューテックス (mutex) をロックする // バッファが確保されていない、もしくはサイズが不足するならば確保する if (!audioBuffer || audioBufferSize < size) { if (audioBuffer) free(audioBuffer); audioBuffer = (uint8_t*)malloc(size); audioBufferSize = size; } *ppPcmBuffer = audioBuffer; } void AudioPostrenderCallback(void* pUserData, uint8_t* pPcmBuffer, unsigned int channels, unsigned int rate, unsigned int nbSamples, unsigned int bitsPerSample, size_t size, int64_t pts) { // TODO: ミューテックス (mutex) をアンロックする // pPcmBufferからオーディオデータのサンプルを、size数だけ取得できる switch (bitsPerSample) { case 8: break; case 16: for (size_t i = 0; i < size; i += 2) { int16_t data = ((int16_t)pPcmBuffer[i + 1] << 8) | pPcmBuffer[i]; } break; } } void VideoPrerenderCallback(void* pUserData, uint8_t** ppPixelBuffer, size_t size) { // TODO: ロック if (!videoBuffer || videoBufferSize < size) { if (videoBuffer) free(videoBuffer); videoBuffer = (uint8_t *)malloc(size); videoBufferSize = size; } *ppPixelBuffer = videoBuffer; } void VideoPostrenderCallback(void* pUserData, uint8_t* pPixelBuffer, int width, int height, int pixelPitch, size_t size, int64_t pts) { // TODO: アンロック // libvlc_MediaParsedChangedイベントで取得したサイズに修正する width = videoWidth ? videoWidth : width; height = videoHeight ? videoHeight : height; // pPixelBufferからビデオのスナップショットを、width × heightの大きさで取得できる } void HandleEvents(const libvlc_event_t* pEvent, void* pUserData) { switch (pEvent->type) { case libvlc_MediaParsedChanged: { libvlc_media_t* pMedia = (libvlc_media_t*)pUserData; libvlc_media_track_t** ppTracks = NULL; unsigned int trackCount = libvlc_media_tracks_get(pMedia, &ppTracks); for (size_t i = 0; i < trackCount; i++) { if (ppTracks[i]->i_type == libvlc_track_video) { libvlc_video_track_t* pVideo = ppTracks[i]->video; videoWidth = pVideo->i_width; videoHeight = pVideo->i_height; } } } } } int main() { const char* const args[] = { "--ignore-config", "--verbose=2" // ログ出力レベル }; libvlc_instance_t* pInstance = libvlc_new(sizeof(args) / sizeof(args[0]), args); libvlc_media_t* pMedia = libvlc_media_new_path(pInstance, "C:\\sample.avi"); char smemOptions[256]; sprintf( smemOptions, ":sout=#transcode{vcodec=RV32,acodec=s16l}" ":smem{" "audio-prerender-callback=%lld," "audio-postrender-callback=%lld," "video-prerender-callback=%lld," "video-postrender-callback=%lld," "audio-data=%lld," "video-data=%lld}", (long long int)(intptr_t)(void*)&AudioPrerenderCallback, (long long int)(intptr_t)(void*)&AudioPostrenderCallback, (long long int)(intptr_t)(void*)&VideoPrerenderCallback, (long long int)(intptr_t)(void*)&VideoPostrenderCallback, (long long int)(intptr_t)(void*)pMedia, (long long int)(intptr_t)(void*)pMedia ); libvlc_media_add_option(pMedia, smemOptions); // イベントに登録 libvlc_event_manager_t* pEventManager = libvlc_media_event_manager(pMedia); libvlc_event_attach(pEventManager, libvlc_MediaParsedChanged, HandleEvents, pMedia); // メディアプレーヤーを作成 libvlc_media_player_t* pMediaPlayer = libvlc_media_player_new(pInstance); libvlc_media_player_set_media(pMediaPlayer, pMedia); libvlc_media_player_play(pMediaPlayer); libvlc_media_release(pMedia); libvlc_state_t state; while (libvlc_state_t::libvlc_Ended != (state = libvlc_media_player_get_state(pMediaPlayer))) { Sleep(10); } libvlc_media_player_stop(pMediaPlayer); libvlc_media_player_release(pMediaPlayer); libvlc_release(pInstance); if (audioBuffer) free(audioBuffer); return 0; }Using libvlc to extract raw frames and audio from media via smem · GitHub GitHub - aleksas/libvlc-stream-grabber: Access video frames and audio sample using libvlc smem module.
vcodec | FourCC |
acodec | TwoCC |
モジュール | 能力 |
---|---|
audio filter | An audio filter, like an equalizer |
audio mixer | An audio channel mixer, like a downmixer |
audio output | An audio output, like Windows DirectX audio output |
decoder | A codec decoder, like theora |
demux | A demuxer, to open a file format, like mkv |
encoder | A codec encoder, like x264 |
interface | An interface, like the Qt interface |
meta reader | A meta reader, to read metadata |
packetizer | A packetizer |
playlist export | A module to write playlist, like .m3u |
services_discovery | A module to get extra content from your computer or the network, like Upnp, DLNA |
sout access | An access for the streaming |
sout mux | A muxer when streaming and encoding |
stream_filter | A stream filter |
text renderer | A way to display subtitles and other text on top of the video |
video filter | A video filter, like contrast adjusting |
visualization2 | A visualizer, to create videos from the music |
vout display | A video output, to display videos like Direct3D or Xv |
VLCのソースコードはVLC media player source code - VideoLANにあります。