forked from StrafesNET/roblox-bot-player
bodge mp4 files
This commit is contained in:
71
Cargo.lock
generated
71
Cargo.lock
generated
@@ -873,6 +873,12 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jni"
|
name = "jni"
|
||||||
version = "0.21.1"
|
version = "0.21.1"
|
||||||
@@ -1049,6 +1055,20 @@ dependencies = [
|
|||||||
"paste",
|
"paste",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mp4"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c9ef834d5ed55e494a2ae350220314dc4aacd1c43a9498b00e320e0ea352a5c3"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder",
|
||||||
|
"bytes",
|
||||||
|
"num-rational",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"thiserror 1.0.69",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mp4ra-rust"
|
name = "mp4ra-rust"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
@@ -1120,6 +1140,37 @@ dependencies = [
|
|||||||
"jni-sys",
|
"jni-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-bigint"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||||
|
dependencies = [
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-integer"
|
||||||
|
version = "0.1.46"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-rational"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||||
|
dependencies = [
|
||||||
|
"num-bigint",
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-traits"
|
name = "num-traits"
|
||||||
version = "0.2.19"
|
version = "0.2.19"
|
||||||
@@ -1741,6 +1792,19 @@ dependencies = [
|
|||||||
"syn 2.0.117",
|
"syn 2.0.117",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.149"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"memchr",
|
||||||
|
"serde",
|
||||||
|
"serde_core",
|
||||||
|
"zmij",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
@@ -2121,6 +2185,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"glam",
|
"glam",
|
||||||
|
"mp4",
|
||||||
"strafesnet_common",
|
"strafesnet_common",
|
||||||
"strafesnet_graphics",
|
"strafesnet_graphics",
|
||||||
"strafesnet_roblox_bot_file",
|
"strafesnet_roblox_bot_file",
|
||||||
@@ -2952,3 +3017,9 @@ dependencies = [
|
|||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.117",
|
"syn 2.0.117",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zmij"
|
||||||
|
version = "1.0.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||||
|
|||||||
@@ -13,3 +13,4 @@ strafesnet_roblox_bot_file.workspace = true
|
|||||||
strafesnet_snf.workspace = true
|
strafesnet_snf.workspace = true
|
||||||
vk-video = "0.2.0"
|
vk-video = "0.2.0"
|
||||||
clap = { version = "4.5.60", features = ["derive"] }
|
clap = { version = "4.5.60", features = ["derive"] }
|
||||||
|
mp4 = "0.14.0"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
use std::io::Write;
|
|
||||||
use std::num::NonZeroU32;
|
use std::num::NonZeroU32;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use strafesnet_common::session::Time as SessionTime;
|
use strafesnet_common::session::Time as SessionTime;
|
||||||
@@ -48,7 +47,7 @@ impl EncodeSubcommand{
|
|||||||
device:self.device,
|
device:self.device,
|
||||||
output_file:self.output_file.unwrap_or_else(||{
|
output_file:self.output_file.unwrap_or_else(||{
|
||||||
let mut output_file:PathBuf=self.bot.file_stem().unwrap().into();
|
let mut output_file:PathBuf=self.bot.file_stem().unwrap().into();
|
||||||
output_file.set_extension("h264");
|
output_file.set_extension("mp4");
|
||||||
output_file
|
output_file
|
||||||
}),
|
}),
|
||||||
map:self.map,
|
map:self.map,
|
||||||
@@ -73,7 +72,10 @@ enum EncodeError{
|
|||||||
VideoCreateTextures(vk_video::VulkanEncoderError),
|
VideoCreateTextures(vk_video::VulkanEncoderError),
|
||||||
VideoEncodeFrame(vk_video::VulkanEncoderError),
|
VideoEncodeFrame(vk_video::VulkanEncoderError),
|
||||||
OutputCreateFile(std::io::Error),
|
OutputCreateFile(std::io::Error),
|
||||||
OutputWriteFile(std::io::Error),
|
OutputMp4Start(mp4::Error),
|
||||||
|
OutputMp4AddTrack(mp4::Error),
|
||||||
|
OutputMp4WriteSample(mp4::Error),
|
||||||
|
OutputMp4End(mp4::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EncodeParams{
|
struct EncodeParams{
|
||||||
@@ -154,9 +156,41 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
)
|
)
|
||||||
.map_err(EncodeError::VideoCreateTextures)?;
|
.map_err(EncodeError::VideoCreateTextures)?;
|
||||||
|
|
||||||
let mut output_file = std::fs::File::create(params.output_file)
|
let output_file=std::fs::File::create(params.output_file)
|
||||||
.map_err(EncodeError::OutputCreateFile)?;
|
.map_err(EncodeError::OutputCreateFile)?;
|
||||||
|
|
||||||
|
let mp4_config=mp4::Mp4Config{
|
||||||
|
major_brand: str::parse("isom").unwrap(),
|
||||||
|
minor_version: 512,
|
||||||
|
compatible_brands: vec![
|
||||||
|
str::parse("isom").unwrap(),
|
||||||
|
str::parse("iso2").unwrap(),
|
||||||
|
str::parse("avc1").unwrap(),
|
||||||
|
str::parse("mp41").unwrap(),
|
||||||
|
],
|
||||||
|
timescale:target_framerate,
|
||||||
|
};
|
||||||
|
let mut mp4=mp4::Mp4Writer::write_start(output_file,&mp4_config)
|
||||||
|
.map_err(EncodeError::OutputMp4Start)?;
|
||||||
|
|
||||||
|
let avc_config=mp4::AvcConfig{
|
||||||
|
width:params.width.get() as u16,
|
||||||
|
height:params.height.get() as u16,
|
||||||
|
// make up some data to prevent this underdeveloped library from crashing
|
||||||
|
seq_param_set:vec![0,0,0,0],
|
||||||
|
pic_param_set:vec![],
|
||||||
|
};
|
||||||
|
let track_config=mp4::TrackConfig{
|
||||||
|
track_type:mp4::TrackType::Video,
|
||||||
|
timescale:target_framerate,
|
||||||
|
language:"eng".to_owned(),
|
||||||
|
media_conf:mp4::MediaConfig::AvcConfig(avc_config),
|
||||||
|
};
|
||||||
|
|
||||||
|
const TRACK_ID:u32=1;
|
||||||
|
mp4.add_track(&track_config)
|
||||||
|
.map_err(EncodeError::OutputMp4AddTrack)?;
|
||||||
|
|
||||||
let duration = bot.duration();
|
let duration = bot.duration();
|
||||||
for i in 0..duration.get()*target_framerate as i64/SessionTime::ONE_SECOND.get() {
|
for i in 0..duration.get()*target_framerate as i64/SessionTime::ONE_SECOND.get() {
|
||||||
let time=SessionTime::raw(i*SessionTime::ONE_SECOND.get()/target_framerate as i64);
|
let time=SessionTime::raw(i*SessionTime::ONE_SECOND.get()/target_framerate as i64);
|
||||||
@@ -171,10 +205,20 @@ fn encode(params:EncodeParams)->Result<(),EncodeError>{
|
|||||||
let res=unsafe{encoder.encode(frame,false)}
|
let res=unsafe{encoder.encode(frame,false)}
|
||||||
.map_err(EncodeError::VideoEncodeFrame)?;
|
.map_err(EncodeError::VideoEncodeFrame)?;
|
||||||
|
|
||||||
output_file.write_all(&res.data)
|
let mp4_sample=mp4::Mp4Sample{
|
||||||
.map_err(EncodeError::OutputWriteFile)?;
|
start_time:i as u64,
|
||||||
|
duration:1,
|
||||||
|
rendering_offset:0,
|
||||||
|
is_sync:false,
|
||||||
|
bytes:res.data.into(),
|
||||||
|
};
|
||||||
|
mp4.write_sample(TRACK_ID,&mp4_sample)
|
||||||
|
.map_err(EncodeError::OutputMp4WriteSample)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mp4.write_end()
|
||||||
|
.map_err(EncodeError::OutputMp4End)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user