ffmpeg-1.2.2 与 vdagent-win-0.8

视频文件的读写函数重定向

    int avio_read(AVIOContext *s, unsigned char *buf, int size)
    int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
    int64_t avio_size(AVIOContext *s)
    int avio_open(AVIOContext **s, const char *filename, int flags)
    int avio_close(AVIOContext *s)

当虚拟机播放视频过程中调用以上的函数时,会把文件名信息,读取文件的 长度等信息发送给客户端的播放器,播放器的 FFMPEG 的底层函数会通过 Socket 的方式读取文件数据,数据的读写传输在下面的章节会详细说明。 猜想:1.vdagent调用被修改过的ffmpeg接口,ffmpeg接口会按照vdagent的消息形式发送控制信息到Client;2.ffmpeg的接口被调用的时候会触发一个hook,此时会调用vdagent方法发送信息到Client

控制信息的读写函数重定向

控制信息的读写函数 以上的这些函数在需要重定向到客户端,客户端的播放器依据传回来的控制 信息来播放视频过程。

av_open_input_file已经弃用了:

- avformat.h

Add avformat_open_input and avformat_write_header().
Deprecate av_open_input_stream, av_open_input_file,
AVFormatParameters and av_write_header.

发送控制信息到客户端需要实现的函数

  • 发送播放视频文件的文件名
    SendFileName(const char *filename); av_open_input_file 中调用
  • 得到播放视频文件的窗口坐标
    SendDisplayArea(const int nWidth,const int nHeight); video_image_display 中在 SDL_DisplayYUVOverlay 之后调用
  • 快进,快退控制
    SendSeekPos(int64_t timestamp, int flags); av_seek_frame 中调用

ffmpeg如何与vdagent通信

文件传输模块的实现

Guest OS 和 Client OS 之间的通过 UDP 进行文件传输

Client OS 视频播放模块

  • 基于SDL的视频播放器的实现。
  • spice客户端的重新编译,添加与播放器互动的代码。