在ffplay

时间:2015-04-27 14:19:42

标签: c encryption ffmpeg

查看ffplay.c(https://github.com/FFmpeg/FFmpeg/blob/master/ffplay.c)并希望支持一些基本加密,哪些代码行最相关?

为了简单起见 - 假设我们使用的是基本的XOR密码密钥,其长度与视频数据相匹配。

换句话说 - 数据实际上在哪里读取并返回字节(这样我们可以在返回字节之前修改它)? :)

1 个答案:

答案 0 :(得分:1)

可以使用您自己的回调/缓冲区使用自定义I/O context来完成:

MyIOContext *ioCtx = new MyIOContext("random_file");
AVFormatContext *avFormatCtx = avformat_alloc_context();
ioCtx->initAVFormatContext(avFormatCtx);
if (avformat_open_input(&avFormatCtx, "", NULL, NULL) != 0) {
    // handle error
}
// ...
avformat_close_input(&avFormatCtx);

来自same source的示例读取函数:

static int IOReadFunc(void *data, uint8_t *buf, int buf_size) {
    MyIOContext *hctx = (MyIOContext*)data;
    size_t len = fread(buf, 1, buf_size, hctx->fh);
    if (len == 0) {
        // Let FFmpeg know that we have reached EOF, or do something else
        return AVERROR_EOF;
    }
    return (int)len;
}

分配:

// allocate the AVIOContext
ioCtx = avio_alloc_context(
    buffer, bufferSize, // internal buffer and its size
    0,            // write flag (1=true,0=false) 
    (void*)this,  // user data, will be passed to our callback functions
    IOReadFunc, 
    0,            // no writing
    IOSeekFunc
);