Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.10
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ python -m venv .venv
source .venv/bin/activate
# Install the required dependencies:
pip install -r requirements.txt
# Setup environment variable
export PYTHONPATH=$PYTHONPATH:$(pwd)
# Run:
python ./smartcut input.mp4 output.mp4 --keep 10,20,40,50
```
Expand Down
6 changes: 6 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def main():
print("Hello from smartcut!")


if __name__ == "__main__":
main()
14 changes: 14 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[project]
name = "smartcut"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"av==12.3.0",
"numpy<2.0.0",
"tqdm>=4.67.1",
]

[project.scripts]
smartcut = "smartcut.__main__:main"
14 changes: 7 additions & 7 deletions smartcut/cut_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,11 +481,11 @@ def recode_segment(self, s: CutSegment) -> list[av.Packet]:
self.transform_graph.vpush(frame)
frame = self.transform_graph.vpull()

frame.pts -= s.start_time / in_tb
frame.pts -= int(s.start_time / in_tb)

frame.pts = frame.pts * in_tb / out_tb
frame.pts = int(frame.pts * in_tb / out_tb)
frame.time_base = out_tb
frame.pts += self.segment_start_in_output / out_tb
frame.pts += int(self.segment_start_in_output / out_tb)

if frame.pts <= self.enc_last_pts:
frame.pts = self.enc_last_pts + 1
Expand All @@ -511,12 +511,12 @@ def remux_segment(self, s: CutSegment) -> list[av.Packet]:
for packet in itertools.chain([packet], demux_iter):
last_packet = packet.dts == s.gop_end_dts
packet.pts -= segment_start_pts
packet.pts = packet.pts * self.in_stream.time_base / self.out_time_base
packet.pts += self.segment_start_in_output / self.out_time_base
packet.pts = int(packet.pts * self.in_stream.time_base / self.out_time_base)
packet.pts += int(self.segment_start_in_output / self.out_time_base)
if packet.dts is not None:
packet.dts -= segment_start_pts
packet.dts = packet.dts * self.in_stream.time_base / self.out_time_base
packet.dts += self.segment_start_in_output / self.out_time_base
packet.dts = int(packet.dts * self.in_stream.time_base / self.out_time_base)
packet.dts += int(self.segment_start_in_output / self.out_time_base)

result_packets.extend(self.remux_bitstream_filter.filter(packet))

Expand Down
Loading