hoseinisalim
Read and write streaming video
I want to read the video in a stream and after the operation on the video, save it as follows.The code below consumes a lot of time to run, and consumes a lot of CPU.
File.stream!(“play.mp4”,, chunk_size) |>
Enum.each (fn(chunk) →# list = :binary.bin_to_list(chunk) # listEnc = for {x, counter} <- Enum.with_index(list) do # x ^^^ Enum.at(listKey,rem(counter,chunk_size)) # end # binDec = :binary.list_to_bin(listEnc)File.write!(“out.mp4”, chunk, [:append, :binary, :raw])
end)
What’s the solution?
Most Liked
voltone
It looks from your sample code (and prior questions you posted) that you’re trying to encrypt the file using a key. Your XOR is basically implementing something called ECB mode, which is not secure. For your use-case, a stream cipher would be a better fit. Erlang supports RC4 and AES-CTR, but since RC4 itself is considered weak, that leaves only AES-CTR.
Here’s how to encode a stream of data read from a binary file:
key = :crypto.strong_rand_bytes(16)
iv = :crypto.strong_rand_bytes(16)
out = File.open!("play.mp4.encrypted", [:binary, :write])
IO.binwrite(out, iv)
File.stream!("play.mp4", [], 1024) |> Enum.reduce(:crypto.stream_init(:aes_ctr, key, iv), fn chunk, state ->
{new_state, data} = :crypto.stream_encrypt(state, chunk)
IO.binwrite(out, data)
new_state
end)
File.close(out)
To decode the file:
key = "???" # same key as before
out = File.open!("play2.mp4", [:binary, :write])
source = File.open!("play.mp4.encrypted", [:binary])
iv = IO.binread(source, 16)
IO.binstream(source, 1024) |> Enum.reduce(:crypto.stream_init(:aes_ctr, key, iv), fn chunk, state ->
{new_state, data} = :crypto.stream_decrypt(state, chunk)
IO.binwrite(out, data)
new_state
end)
File.close(source)
File.close(out)
aseigo
IO.write/2 expects character data / strings. You have arbitrary binary data and that does not map properly to that assumption. You want IO.binwrite/2.
That said, if you are doing significant multimedia work, you may wish to check out Membrane Framework in case it is useful / applicable to your needs.







