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.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








