查看ffplay.c(https://github.com/FFmpeg/FFmpeg/blob/master/ffplay.c)并希望支持一些基本加密,哪些代码行最相关?
为了简单起见 - 假设我们使用的是基本的XOR密码密钥,其长度与视频数据相匹配。
换句话说 - 数据实际上在哪里读取并返回字节(这样我们可以在返回字节之前修改它)? :)
答案 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
);