|
|
@ -58,7 +58,17 @@ impl AudioTranscoder {
|
|
|
|
.send_packet(&packet)
|
|
|
|
.send_packet(&packet)
|
|
|
|
.map_err(|err| format!("Failed sending audio packet: {}", err))?;
|
|
|
|
.map_err(|err| format!("Failed sending audio packet: {}", err))?;
|
|
|
|
while let Some(frame) = self.decoder.read_frame()? {
|
|
|
|
while let Some(frame) = self.decoder.read_frame()? {
|
|
|
|
self.frame_buffer.insert_frame(frame);
|
|
|
|
let resampled = self.resampler.convert(&frame)?;
|
|
|
|
|
|
|
|
let resampled_pts = resampled.pts();
|
|
|
|
|
|
|
|
self.frame_buffer.insert_frame(resampled);
|
|
|
|
|
|
|
|
let mut offset: f64 = 0f64;
|
|
|
|
|
|
|
|
while let Some(drain_resampled) = self.resampler.drain()? {
|
|
|
|
|
|
|
|
offset += (drain_resampled.nb_samples() as f64 / self.encoder.sample_rate() as f64)
|
|
|
|
|
|
|
|
* self.input_stream.time_base().den() as f64;
|
|
|
|
|
|
|
|
drain_resampled.set_pts(resampled_pts + offset as i64);
|
|
|
|
|
|
|
|
self.frame_buffer.insert_frame(drain_resampled);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
self.encode()?;
|
|
|
|
self.encode()?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -120,6 +130,10 @@ impl AudioTranscoder {
|
|
|
|
fn encode(&mut self) -> Result<(), String> {
|
|
|
|
fn encode(&mut self) -> Result<(), String> {
|
|
|
|
while let Some(frame) = self.frame_buffer.pop_first() {
|
|
|
|
while let Some(frame) = self.frame_buffer.pop_first() {
|
|
|
|
let pts_passed = frame.pts() - self.last_pts;
|
|
|
|
let pts_passed = frame.pts() - self.last_pts;
|
|
|
|
|
|
|
|
if pts_passed <= 0 && self.last_pts != 0 {
|
|
|
|
|
|
|
|
println!("WARN: new frame out of order");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pts_passed + self.current_pts) > (5 * self.input_stream.time_base().den()) as i64 {
|
|
|
|
if (pts_passed + self.current_pts) > (5 * self.input_stream.time_base().den()) as i64 {
|
|
|
|
self.format.write_packet_null()?;
|
|
|
|
self.format.write_packet_null()?;
|
|
|
|
println!(
|
|
|
|
println!(
|
|
|
@ -145,6 +159,7 @@ impl AudioTranscoder {
|
|
|
|
self.output_stream.time_base(),
|
|
|
|
self.output_stream.time_base(),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
new_packet.set_stream(0);
|
|
|
|
new_packet.set_stream(0);
|
|
|
|
|
|
|
|
new_packet.data();
|
|
|
|
self.format.write_packet(&new_packet)?;
|
|
|
|
self.format.write_packet(&new_packet)?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -197,6 +212,7 @@ impl Transcoder {
|
|
|
|
))?;
|
|
|
|
))?;
|
|
|
|
decoder.configure(&input_stream)?;
|
|
|
|
decoder.configure(&input_stream)?;
|
|
|
|
decoder.open()?;
|
|
|
|
decoder.open()?;
|
|
|
|
|
|
|
|
decoder.set_time_base(input_stream.time_base());
|
|
|
|
|
|
|
|
|
|
|
|
let encoder = output_stream
|
|
|
|
let encoder = output_stream
|
|
|
|
.encoder(None)
|
|
|
|
.encoder(None)
|
|
|
@ -217,14 +233,30 @@ impl Transcoder {
|
|
|
|
encoder.set_frame_size(decoder.frame_size() * 4);
|
|
|
|
encoder.set_frame_size(decoder.frame_size() * 4);
|
|
|
|
encoder.open()?;
|
|
|
|
encoder.open()?;
|
|
|
|
encoder.configure(&output_stream)?;
|
|
|
|
encoder.configure(&output_stream)?;
|
|
|
|
|
|
|
|
println!(
|
|
|
|
|
|
|
|
"audio input stream: {}/{}",
|
|
|
|
|
|
|
|
input_stream.time_base().num(),
|
|
|
|
|
|
|
|
input_stream.time_base().den()
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
println!(
|
|
|
|
println!(
|
|
|
|
"audio decoder[{}] -> audio encoder[{}]",
|
|
|
|
"audio decoder[{}] ({:?} {}hz | {}/{}) -> audio encoder[{}] ({:?} {}hz | {}/{})",
|
|
|
|
decoder.name(),
|
|
|
|
decoder.name(),
|
|
|
|
encoder.name()
|
|
|
|
decoder.codec(),
|
|
|
|
|
|
|
|
decoder.sample_rate(),
|
|
|
|
|
|
|
|
decoder.time_base().num(),
|
|
|
|
|
|
|
|
decoder.time_base().den(),
|
|
|
|
|
|
|
|
encoder.name(),
|
|
|
|
|
|
|
|
encoder.codec(),
|
|
|
|
|
|
|
|
encoder.sample_rate(),
|
|
|
|
|
|
|
|
encoder.time_base().num(),
|
|
|
|
|
|
|
|
encoder.time_base().den(),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let resampler = Resampler::from_coder(&decoder, &encoder);
|
|
|
|
let resampler = Resampler::from_coder(&decoder, &encoder);
|
|
|
|
|
|
|
|
let mut audio_options = Dictionary::new();
|
|
|
|
|
|
|
|
audio_options.copy_from(&mut options);
|
|
|
|
|
|
|
|
format.init_output(audio_options);
|
|
|
|
|
|
|
|
|
|
|
|
Some(AudioTranscoder {
|
|
|
|
Some(AudioTranscoder {
|
|
|
|
frame_buffer: SortedFrameBuffer::new(),
|
|
|
|
frame_buffer: SortedFrameBuffer::new(),
|
|
|
@ -376,6 +408,8 @@ impl Transcoder {
|
|
|
|
.map_err(|_| format!("Failed to write video segment {}", self.video_segment))?;
|
|
|
|
.map_err(|_| format!("Failed to write video segment {}", self.video_segment))?;
|
|
|
|
self.start_segment(false);
|
|
|
|
self.start_segment(false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.video_encoder.flush();
|
|
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|