Skip to content

Commit cf9fd63

Browse files
committed
composer.rs: MP4ライターの初期化をストリームIDベースに変更し、レシーバーからキューベースの処理に移行
1 parent f3e73a0 commit cf9fd63

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

src/composer.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ use orfail::OrFail;
44
use shiguredo_openh264::Openh264Library;
55

66
use crate::{
7+
78
audio::AudioDataReceiver,
89
channel::{self, ErrorFlag},
910
decoder::VideoDecoderOptions,
1011
encoder::{AudioEncoder, AudioEncoderThread, VideoEncoder, VideoEncoderThread},
1112
layout::Layout,
12-
media::MediaStreamIdGenerator,
13+
media::{MediaStreamIdGenerator,MediaStreamId }
1314
mixer_audio::AudioMixerThread,
1415
mixer_video::VideoMixerThread,
1516
source::{AudioSourceThread, VideoSourceThread},
@@ -80,11 +81,18 @@ impl Composer {
8081
.or_fail()?;
8182

8283
// 合成後の映像と音声への MP4 への書き出しを行う(この処理は現在のスレッドで行う)
84+
let writer_input_audio_stream_id = MediaStreamId::new(1000); // audio / video で値が異なっていればなんでもいい
85+
let writer_input_video_stream_id = MediaStreamId::new(1001);
86+
8387
let mut mp4_writer = Mp4Writer::new(
8488
out_file_path,
8589
&self.layout,
86-
encoded_audio_rx,
87-
encoded_video_rx,
90+
self.layout
91+
.has_audio()
92+
.then_some(writer_input_audio_stream_id),
93+
self.layout
94+
.has_video()
95+
.then_some(writer_input_video_stream_id),
8896
)
8997
.or_fail()?;
9098

src/writer_mp4.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
collections::VecDeque,
23
fs::File,
34
io::{BufWriter, Seek, SeekFrom, Write},
45
num::NonZeroU32,
@@ -17,11 +18,12 @@ use shiguredo_mp4::{
1718
};
1819

1920
use crate::{
20-
audio::{AudioData, AudioDataReceiver},
21+
audio::AudioData,
2122
layout::{Layout, Resolution},
23+
media::MediaStreamId,
2224
mixer_audio::MIXED_AUDIO_DATA_DURATION,
2325
stats::{Mp4WriterStats, Seconds},
24-
video::{VideoFrame, VideoFrameReceiver},
26+
video::VideoFrame,
2527
};
2628

2729
// Hisui では出力 MP4 のタイムスケールはマイクロ秒固定にする
@@ -42,8 +44,10 @@ pub struct Mp4Writer {
4244
video_chunks: Vec<Chunk>,
4345
audio_sample_entry: Option<SampleEntry>,
4446
video_sample_entry: Option<SampleEntry>,
45-
input_audio_rx: Option<AudioDataReceiver>,
46-
input_video_rx: Option<VideoFrameReceiver>,
47+
input_audio_stream_id: Option<MediaStreamId>,
48+
input_video_stream_id: Option<MediaStreamId>,
49+
input_audio_queue: VecDeque<AudioData>,
50+
input_video_queue: VecDeque<VideoFrame>,
4751
finalize_time: Mp4FileTime,
4852
appending_video_chunk: bool,
4953
stats: Mp4WriterStats,
@@ -54,8 +58,8 @@ impl Mp4Writer {
5458
pub fn new<P: AsRef<Path>>(
5559
path: P,
5660
layout: &Layout,
57-
input_audio_rx: AudioDataReceiver,
58-
input_video_rx: VideoFrameReceiver,
61+
input_audio_stream_id: Option<MediaStreamId>,
62+
input_video_stream_id: Option<MediaStreamId>,
5963
) -> orfail::Result<Self> {
6064
let file = std::fs::OpenOptions::new()
6165
.create(true)
@@ -74,8 +78,10 @@ impl Mp4Writer {
7478
audio_sample_entry: None,
7579
video_sample_entry: None,
7680
finalize_time: Mp4FileTime::from_unix_time(Duration::ZERO),
77-
input_audio_rx: layout.has_audio().then_some(input_audio_rx),
78-
input_video_rx: layout.has_video().then_some(input_video_rx),
81+
input_audio_stream_id,
82+
input_video_stream_id,
83+
input_audio_queue: VecDeque::new(),
84+
input_video_queeu: VecDeque::new(),
7985
appending_video_chunk: true,
8086
stats: Mp4WriterStats::default(),
8187
};

0 commit comments

Comments
 (0)