
Recherche avancée
Médias (1)
-
Géodiversité
9 septembre 2011, par ,
Mis à jour : Août 2018
Langue : français
Type : Texte
Autres articles (111)
-
Participer à sa traduction
10 avril 2011Vous pouvez nous aider à améliorer les locutions utilisées dans le logiciel ou à traduire celui-ci dans n’importe qu’elle nouvelle langue permettant sa diffusion à de nouvelles communautés linguistiques.
Pour ce faire, on utilise l’interface de traduction de SPIP où l’ensemble des modules de langue de MediaSPIP sont à disposition. ll vous suffit de vous inscrire sur la liste de discussion des traducteurs pour demander plus d’informations.
Actuellement MediaSPIP n’est disponible qu’en français et (...) -
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs -
Emballe médias : à quoi cela sert ?
4 février 2011, parCe plugin vise à gérer des sites de mise en ligne de documents de tous types.
Il crée des "médias", à savoir : un "média" est un article au sens SPIP créé automatiquement lors du téléversement d’un document qu’il soit audio, vidéo, image ou textuel ; un seul document ne peut être lié à un article dit "média" ;
Sur d’autres sites (11198)
-
Cortex-A7 instruction cycle timings
15 mai 2014, par Mans — ARMThe Cortex-A7 ARM core is a popular choice in low-power and low-cost designs. Unfortunately, the public TRM does not include instruction timing information. It does reveal that execution is in-order which makes measuring the throughput and latency for individual instructions relatively straight-forward.
The table below lists the measured issue cycles (inverse throughput) and result latency of some commonly used instructions.
It should be noted that in some cases, the perceived latency depends on the instruction consuming the result. Most of the values were measured with the result used as input to the same instruction. For instructions with multiple outputs, the latencies of the result registers may also differ.
Finally, although instruction issue is in-order, completion is out of order, allowing independent instructions to issue and complete unimpeded while a multi-cycle instruction is executing in another unit. For example, a 3-cycle MUL instruction does not block ADD instructions following it in program order.
ALU instructions Issue cycles Result latency MOV Rd, Rm 1/2 1 ADD Rd, Rn, #imm 1/2 1 ADD Rd, Rn, Rm 1 1 ADD Rd, Rn, Rm, LSL #imm 1 1 ADD Rd, Rn, Rm, LSL Rs 1 1 LSL Rd, Rn, #imm 1 2 LSL Rd, Rn, Rs 1 2 QADD Rd, Rn, Rm 1 2 QADD8 Rd, Rn, Rm 1 2 QADD16 Rd, Rn, Rm 1 2 CLZ Rd, Rm 1 1 RBIT Rd, Rm 1 2 REV Rd, Rm 1 2 SBFX Rd, Rn 1 2 BFC Rd, #lsb, #width 1 2 BFI Rd, Rn, #lsb, #width 1 2 NOTE : Shifted operands and shift amounts needed one cycle early. Multiply instructions Issue cycles Result latency MUL Rd, Rn, Rm 1 3 MLA Rd, Rn, Rm, Ra 1 31 SMULL Rd, RdHi, Rn, Rm 1 3 SMLAL Rd, RdHi, Rn, Rm 1 31 SMMUL Rd, Rn, Rm 1 3 SMMLA Rd, Rn, Rm, Ra 1 31 SMULBB Rd, Rn, Rm 1 3 SMLABB Rd, Rn, Rm, Ra 1 31 SMULWB Rd, Rn, Rm 1 3 SMLAWB Rd, Rn, Rm, Ra 1 31 SMUAD Rd, Rn, Rm 1 3 1 Accumulator forwarding allows back to back MLA instructions without delay. Divide instructions Issue cycles Result latency SDIV Rd, Rn, Rm 4-20 6-22 UDIV Rd, Rn, Rm 3-19 5-21 Load/store instructions Issue cycles Result latency LDR Rt, [Rn] 1 3 LDR Rt, [Rn, #imm] 1 3 LDR Rt, [Rn, Rm] 1 3 LDR Rt, [Rn, Rm, lsl #imm] 1 3 LDRD Rt, Rt2, [Rn] 1 3-4 LDM Rn, regs 1-8 3-10 STR Rt, [Rn] 1 2 STRD Rt, Rt2, [Rn] 1 2 STM Rn, regs 1-10 2-12 NOTE : Load results are forwarded to dependent stores without delay. VFP instructions Issue cycles Result latency VMOV.F32 Sd, Sm 1 4 VMOV.F64 Dd, Dm 1 4 VNEG.F32 Sd, Sm 1 4 VNEG.F64 Dd, Dm 1 4 VABS.F32 Sd, Sm 1 4 VABS.F64 Dd, Dm 1 4 VADD.F32 Sd, Sn, Sm 1 4 VADD.F64 Dd, Dn, Dm 1 4 VMUL.F32 Sd, Sn, Sm 1 4 VMUL.F64 Dd, Dn, Dm 4 7 VMLA.F32 Sd, Sn, Sm 1 81 VMLA.F64 Dd, Dn, Dm 4 112 VFMA.F32 Sd, Sn, Sm 1 81 VFMA.F64 Dd, Dn, Dm 5 82 VDIV.F32 Sd, Sn, Sm 15 18 VDIV.F64 Dd, Dn, Dm 29 32 VSQRT.F32 Sd, Sm 14 17 VSQRT.F64 Dd, Dm 28 31 VCVT.F32.F64 Sd, Dm 1 4 VCVT.F64.F32 Dd, Sm 1 4 VCVT.F32.S32 Sd, Sm 1 4 VCVT.F64.S32 Dd, Sm 1 4 VCVT.S32.F32 Sd, Sm 1 4 VCVT.S32.F64 Sd, Dm 1 4 VCVT.F32.S32 Sd, Sd, #fbits 1 4 VCVT.F64.S32 Dd, Dd, #fbits 1 4 VCVT.S32.F32 Sd, Sd, #fbits 1 4 VCVT.S32.F64 Dd, Dd, #fbits 1 4 1 5 cycles with dependency only on accumulator.
2 8 cycles with dependency only on accumulator.NEON integer instructions Issue cycles Result latency VADD.I8 Dd, Dn, Dm 1 4 VADDL.S8 Qd, Dn, Dm 2 4 VADD.I8 Qd, Qn, Qm 2 4 VMUL.I8 Dd, Dn, Dm 2 4 VMULL.S8 Qd, Dn, Dm 2 4 VMUL.I8 Qd, Qn, Qm 4 4 VMLA.I8 Dd, Dn, Dm 2 4 VMLAL.S8 Qd, Dn, Dm 2 4 VMLA.I8 Qd, Qn, Qm 4 4 VADD.I16 Dd, Dn, Dm 1 4 VADDL.S16 Qd, Dn, Dm 2 4 VADD.I16 Qd, Qn, Qm 2 4 VMUL.I16 Dd, Dn, Dm 1 4 VMULL.S16 Qd, Dn, Dm 2 4 VMUL.I16 Qd, Qn, Qm 2 4 VMLA.I16 Dd, Dn, Dm 1 4 VMLAL.S16 Qd, Dn, Dm 2 4 VMLA.I16 Qd, Qn, Qm 2 4 VADD.I32 Dd, Dn, Dm 1 4 VADDL.S32 Qd, Dn, Dm 2 4 VADD.I32 Qd, Qn, Qm 2 4 VMUL.I32 Dd, Dn, Dm 2 4 VMULL.S32 Qd, Dn, Dm 2 4 VMUL.I32 Qd, Qn, Qm 4 4 VMLA.I32 Dd, Dn, Dm 2 4 VMLAL.S32 Qd, Dn, Dm 2 4 VMLA.I32 Qd, Qn, Qm 4 4 NEON floating-point instructions Issue cycles Result latency VADD.F32 Dd, Dn, Dm 2 4 VADD.F32 Qd, Qn, Qm 4 4 VMUL.F32 Dd, Dn, Dm 2 4 VMUL.F32 Qd, Qn, Qm 4 4 VMLA.F32 Dd, Dn, Dm 2 81 VMLA.F32 Qd, Qn, Qm 4 81 1 5 cycles with dependency only on accumulator. NEON permute instructions Issue cycles Result latency VEXT.n Dd, Dn, Dm, #imm 1 4 VEXT.n Qd, Qn, Qm, #imm 2 5 VTRN.n Dd, Dn, Dm 2 5 VTRN.n Qd, Qn, Qm 4 5 VUZP.n Dd, Dn, Dm 2 5 VUZP.n Qd, Qn, Qm 4 6 VZIP.n Dd, Dn, Dm 2 5 VZIP.n Qd, Qn, Qm 4 6 VTBL.8 Dd, Dn, Dm 1 4 VTBL.8 Dd, Dn-Dn+1, Dm 1 4 VTBL.8 Dd, Dn-Dn+2, Dm 2 5 VTBL.8 Dd, Dn-Dn+3, Dm 2 5 -
Revision 29944 : On peut comptabiliser les pages du privé
17 juillet 2009, par kent1@… — LogOn peut comptabiliser les pages du privé
-
I'm trying to hide information in a H264 video. When I stitch the video up, split it into frames again and try to read it, the information is lost
18 mai 2024, par Wer WerI'm trying to create a video steganography python script. The algorithm for hiding will be...


- 

- convert any video codec into h264 lossless
- save the audio of the video and split the h264 video into frames
- hide my txt secret into frame0 using LSB replacement method
- stitch the video back up and put in the audio










...and when I want to recover the text, I'll


- 

- save the audio of the video and split the encoded h264 video into frames
- retrieve my hidden text from frame0 and print the text






So, this is what I can do :


- 

- split the video
- hide the text in frame0
- retrieve the text from frame0
- stitch the video










But after stitching the video, when I tried to retrieve the text by splitting that encrypted video, it appears that the text has been lost. This is because i got the error


UnicodeEncodeError: 'charmap' codec can't encode character '\x82' in position 21: character maps to <undefined>
</undefined>


I'm not sure if my LSB replacement algorithm was lost, which results in my not being able to retrieve my frame 0 information, or if the H264 conversion command I used was a converted my video into H264 lossy version instead of lossless (which I don't believe so because I specified -qp 0)
This was the command I used to convert my video


ffmpeg -i video.mp4 -t 12 -c:v libx264 -preset veryslow -qp 0 output.mp4



These are my codes


import json
import os
import magic
import ffmpeg
import cv2
import numpy as np

import subprocess

# Path to the file you want to check
here = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(here, "output.mp4")
raw_video = cv2.VideoCapture(file_path)
audio_output_path = os.path.join(here, "audio.aac")
final_video_file = os.path.join(here, "output.mp4")

# create a folder to save the frames.
frames_directory = os.path.join(here, "data1")
try:
 if not os.path.exists(frames_directory):
 os.makedirs(frames_directory)
except OSError:
 print("Error: Creating directory of data")

file_path_txt = os.path.join(here, "hiddentext.txt")
# Read the content of the file in binary mode
with open(file_path_txt, "r") as f:
 file_content = f.read()
# txt_binary_representation = "".join(format(byte, "08b") for byte in file_content)
# print(file_content)

"""
use this cmd to convert any video to h264 lossless. original vid in 10 bit depth format
ffmpeg -i video.mp4 -c:v libx264 -preset veryslow -qp 0 output.mp4

use this cmd to convert any video to h264 lossless. original vid in 8 bit depth format
ffmpeg -i video.mp4 -c:v libx264 -preset veryslow -crf 0 output.mp4

i used this command to only get first 12 sec of video because the h264 vid is too large 
ffmpeg -i video.mp4 -t 12 -c:v libx264 -preset veryslow -qp 0 output.mp4

check for multiple values to ensure its h264 lossless:
1. CRF = 0
2. qp = 0
3. High 4:4:4 Predictive
"""


# region --codec checking. ensure video is h264 lossless--
def check_h264_lossless(file_path):
 try:
 # Use ffprobe to get detailed codec information, including tags
 result = subprocess.run(
 [
 "ffprobe",
 "-v",
 "error",
 "-show_entries",
 "stream=codec_name,codec_long_name,profile,level,bit_rate,avg_frame_rate,nb_frames,tags",
 "-of",
 "json",
 file_path,
 ],
 stdout=subprocess.PIPE,
 stderr=subprocess.PIPE,
 text=True,
 )
 # Check if the file is lossless
 metadata = check_h264_lossless(file_path)
 print(json.dumps(metadata, indent=4))

 # Check if the CRF value is available in the tags
 for stream in metadata.get("streams", []):
 if stream.get("codec_name") == "h264":
 tags = stream.get("tags", {})
 crf_value = tags.get("crf")
 encoder = tags.get("encoder")
 print(f"CRF value: {crf_value}")
 print(f"Encoder: {encoder}")
 return json.loads(result.stdout)
 except Exception as e:
 return f"An error occurred: {e}"


# endregion


# region --splitting video into frames--
def extract_audio(input_video_path, audio_output_path):
 if os.path.exists(audio_output_path):
 print(f"Audio file {audio_output_path} already exists. Skipping extraction.")
 return
 command = [
 "ffmpeg",
 "-i",
 input_video_path,
 "-q:a",
 "0",
 "-map",
 "a",
 audio_output_path,
 ]
 try:
 subprocess.run(command, check=True)
 print(f"Audio successfully extracted to {audio_output_path}")
 except subprocess.CalledProcessError as e:
 print(f"An error occurred: {e}")


def split_into_frames():
 extract_audio(file_path, audio_output_path)
 currentframe = 0
 print("Splitting...")
 while True:
 ret, frame = raw_video.read()
 if ret:
 name = os.path.join(here, "data1", f"frame{currentframe}.png")
 # print("Creating..." + name)
 cv2.imwrite(name, frame)
 currentframe += 1
 else:
 print("Complete")
 break


# endregion


# region --merge all back into h264 lossless--
# output_video_file = "output1111.mp4"


def stitch_frames_to_video(frames_dir, output_video_path, framerate=60):
 command = [
 "ffmpeg",
 "-y",
 "-framerate",
 str(framerate),
 "-i",
 os.path.join(frames_dir, "frame%d.png"),
 "-c:v",
 "libx264",
 "-preset",
 "veryslow",
 "-qp",
 "0",
 output_video_path,
 ]

 try:
 subprocess.run(command, check=True)
 print(f"Video successfully created at {output_video_path}")
 except subprocess.CalledProcessError as e:
 print(f"An error occurred: {e}")


def add_audio_to_video(video_path, audio_path, final_output_path):
 command = [
 "ffmpeg",
 "-i",
 video_path,
 "-i",
 audio_path,
 "-c:v",
 "copy",
 "-c:a",
 "aac",
 "-strict",
 "experimental",
 final_output_path,
 ]
 try:
 subprocess.run(command, check=True)
 print(f"Final video with audio created at {final_output_path}")
 except subprocess.CalledProcessError as e:
 print(f"An error occurred: {e}")


# endregion


def to_bin(data):
 if isinstance(data, str):
 return "".join([format(ord(i), "08b") for i in data])
 elif isinstance(data, bytes) or isinstance(data, np.ndarray):
 return [format(i, "08b") for i in data]
 elif isinstance(data, int) or isinstance(data, np.uint8):
 return format(data, "08b")
 else:
 raise TypeError("Type not supported")


def encode(image_name, secret_data):
 image = cv2.imread(image_name)
 n_bytes = image.shape[0] * image.shape[1] * 3 // 8
 print("[*] Maximum bytes to encode:", n_bytes)
 secret_data += "====="
 if len(secret_data) > n_bytes:
 raise ValueError("[!] Insufficient bytes, need bigger image or less data")
 print("[*] Encoding Data")

 data_index = 0
 binary_secret_data = to_bin(secret_data)
 data_len = len(binary_secret_data)
 for row in image:
 for pixel in row:
 r, g, b = to_bin(pixel)
 if data_index < data_len:
 pixel[0] = int(r[:-1] + binary_secret_data[data_index], 2)
 data_index += 1
 if data_index < data_len:
 pixel[1] = int(g[:-1] + binary_secret_data[data_index], 2)
 data_index += 1
 if data_index < data_len:
 pixel[2] = int(b[:-1] + binary_secret_data[data_index], 2)
 data_index += 1
 if data_index >= data_len:
 break
 return image


def decode(image_name):
 print("[+] Decoding")
 image = cv2.imread(image_name)
 binary_data = ""
 for row in image:
 for pixel in row:
 r, g, b = to_bin(pixel)
 binary_data += r[-1]
 binary_data += g[-1]
 binary_data += b[-1]
 all_bytes = [binary_data[i : i + 8] for i in range(0, len(binary_data), 8)]
 decoded_data = ""
 for byte in all_bytes:
 decoded_data += chr(int(byte, 2))
 if decoded_data[-5:] == "=====":
 break
 return decoded_data[:-5]


frame0_path = os.path.join(here, "data1", "frame0.png")
encoded_image_path = os.path.join(here, "data1", "frame0.png")


def encoding_function():
 split_into_frames()

 encoded_image = encode(frame0_path, file_content)
 cv2.imwrite(encoded_image_path, encoded_image)

 stitch_frames_to_video(frames_directory, file_path)
 add_audio_to_video(file_path, audio_output_path, final_video_file)


def decoding_function():
 split_into_frames()
 decoded_message = decode(encoded_image_path)
 print(f"[+] Decoded message: {decoded_message}")


# encoding_function()
decoding_function()




So I tried to put my decoding function into my encoding function like this


def encoding_function():
 split_into_frames()

 encoded_image = encode(frame0_path, file_content)
 cv2.imwrite(encoded_image_path, encoded_image)

#immediately get frame0 and decode without stitching to check if the data is there
 decoded_message = decode(encoded_image_path)
 print(f"[+] Decoded message: {decoded_message}")

 stitch_frames_to_video(frames_directory, file_path)
 add_audio_to_video(file_path, audio_output_path, final_video_file)




This returns my secret text from frame0. But splitting it after stitching does not return my hidden text. The hidden text was lost


def decoding_function():
 split_into_frames()
#this function is after the encoding_function(). the secret text is lost, resulting in charmap codec #can't encode error
 decoded_message = decode(encoded_image_path)
 print(f"[+] Decoded message: {decoded_message}")



EDIT :
So i ran the encoding function first, copied frame0.png out and placed it some where. Then I ran the decoding function, and got another frame0.png.


I ran both frame0.png into this python function


frame0_data1_path = os.path.join(here, "data1", "frame0.png")
frame0_data2_path = os.path.join(here, "data2", "frame0.png")
frame0_data1 = cv2.imread(frame0_data1_path)
frame0_data2 = cv2.imread(frame0_data2_path)

if frame0_data1 is None:
 print(f"Error: Could not load image from {frame0_data1_path}")
elif frame0_data2 is None:
 print(f"Error: Could not load image from {frame0_data2_path}")
else:

 if np.array_equal(frame0_data1, frame0_data2):
 print("The frames are identical.")
 else:
 print("The frames are different.")



...and apparently both are different. This means my frame0 binary got changed when I stitch back into the video after encoding. Is there a way to make it not change ? Or will h264 or any video codec change a little bit when you stitch the frames back up ?