You can make an image move like water by using a displacement map. This will warp the image as if the folds in the surface of the water are refracting the light as it passes through. For better results, you'd also want a separate map for reflection and/or specularity on top of the water surface. Here's an example in Blackmagic Fusion. If you copy the code text here, and paste it into the Node graph of fusion, it'll show up as a working composition. Here's what the result looks like. Of course, you'll need to supply your own footage, but you can examine this setup to see how it works.
{
Tools = ordered() {
MediaIn1 = MediaIn {
ExtentSet = true,
CustomData = {
MediaProps = {
MEDIA_HEIGHT = 2160,
MEDIA_LAYERS_IN_OUT_LIST = {
{
0,
24
}
},
MEDIA_MARK_IN = 0,
MEDIA_MARK_OUT = 23,
MEDIA_NAME = "Fusion Clip 1",
MEDIA_NUM_FRAMES = 24,
MEDIA_NUM_LAYERS = 1,
MEDIA_PAR = 1,
MEDIA_SRC_FRAME_RATE = 23.976023976024,
MEDIA_START_FRAME = 0,
MEDIA_WIDTH = 4096
},
},
Inputs = {
GlobalOut = Input { Value = 23, },
Layer = Input { Value = "0", },
ClipTimeEnd = Input { Value = 23, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 114.524, 26.8857 } },
},
TimeSpeed1 = TimeSpeed {
Inputs = {
Speed = Input { Value = 5, },
Input = Input {
SourceOp = "MediaIn2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 191.735, 135.686 } },
},
Displace1 = Displace {
Inputs = {
UseGPU = Input { Value = 0, },
Offset = Input { Value = -0.445, },
RefractionStrength = Input { Value = 0.95, },
LightPower = Input { Value = 3, },
Spread = Input { Value = 1.228, },
LightChannel = Input { Value = 5, },
Input = Input {
SourceOp = "MediaIn1",
Source = "Output",
},
Foreground = Input {
SourceOp = "TimeSpeed1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 290.267, 56.7689 } },
},
MediaIn2 = MediaIn {
ExtentSet = true,
CustomData = {
MediaProps = {
MEDIA_FORMAT_TYPE = "QuickTime",
MEDIA_HEIGHT = 360,
MEDIA_MARK_IN = 0,
MEDIA_MARK_OUT = 449,
MEDIA_NAME = "122253798-animated-background-abstract-c.mp4",
MEDIA_NUM_FRAMES = 450,
MEDIA_NUM_LAYERS = 1,
MEDIA_PAR = 1,
MEDIA_PATH = "/Users/jasonconrad/Movies/122253798-animated-background-abstract-c.mp4",
MEDIA_SRC_FRAME_RATE = 30,
MEDIA_START_FRAME = 0,
MEDIA_WIDTH = 640
},
},
Inputs = {
GlobalOut = Input { Value = 449, },
MediaID = Input { Value = "87a9779e-8ba3-47cc-a30d-7b1cbf3b3ff2", },
Layer = Input { Value = "", },
ClipTimeEnd = Input { Value = 449, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 134.151, 185.76 } },
},
Merge1 = Merge {
CtrlWZoom = false,
Inputs = {
Background = Input {
SourceOp = "Displace1",
Source = "Output",
},
Foreground = Input {
SourceOp = "TimeSpeed1",
Source = "Output",
},
Size = Input { Value = 6.6, },
SubtractiveAdditive = Input { Value = 0.118, },
Gain = Input { Value = 0.15, },
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 468.84, 64.6124 } },
},
MediaOut1 = MediaOut {
Inputs = {
Index = Input { Value = "0", },
Input = Input {
SourceOp = "Merge1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 653.863, 63.2301 } },
}
},
ActiveTool = "Merge1"
}