hoseinisalim

hoseinisalim

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?

Showing Posts 1 to 6

idi527

idi527

I think functions from the Enum module all all eager, maybe you can try Stream module instead. File.write! is eager as well, I think. Try IO.binwrite/2. In general, though, you’d want to operate on frames or maybe nal units for h264, which might not be what you get just by splitting the video file into chunk_size. I’d just use ffmpeg, probably for a one-off task like this.

hoseinisalim

hoseinisalim OP

I tested the code below, but it makes a error:

“play.mp4”
|> File.stream!(,chunk_size)
|> Stream.chunk_every(chunk_size, chunk_size, )
|> Enum.reduce(File.open!(“output.mp4”, [:write, :binary]), fn chunk, file →
:ok = IO.write(file, chunk)
file
end)

this error is:

** (ErlangError) Erlang error: :no_translation
(stdlib) :io.put_chars(pid<0.180.0>, :unicode, [<<32, 32, 32, 181, 32, 32, 32, 177, 32, 32, 32, 162, 32, 32, 32, 102, 32, 32, 32, 135, 32, 32, 32, 245, 32, 32, 1, 1, 32, 32, 32, 248, 32, 32, 32, 241, 32, 32, 32>>])

aseigo

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.

hoseinisalim

hoseinisalim OP

Thanks for answering.

|> Enum.reduce(File.open!(“output.mp4”, [:write]), fn chunk, file →
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)
:ok = IO.binwrite(file, binDec)
file
end)

I want to do XOR between each chunk with another binary list but the following error occurs.

(ArgumentError) argument error
(stdlib) :binary.bin_to_list

voltone

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)
hoseinisalim

hoseinisalim OP

Thank you very much for your help and code but I have to implement the XOR method.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New

Other Trending Topics Top

mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews