Don't try to write an audio frame if there aren't any planes

This commit is contained in:
viv 2021-08-01 00:08:18 -07:00
parent 3beb1a8519
commit 3cad3b1e29
1 changed files with 29 additions and 28 deletions

View File

@ -308,43 +308,44 @@ static bool ffmpeg_init_config(struct ff_config_param *params,
} }
} }
// Assumption: if there is a video frame, there is an audio frame.
let mut aframe = frame::Audio::new( let mut aframe = frame::Audio::new(
format::Sample::I16(format::sample::Type::Packed), format::Sample::I16(format::sample::Type::Packed),
self.audio_buf.len(), self.audio_buf.len(),
ChannelLayout::STEREO ChannelLayout::STEREO
); );
aframe.set_channels(2); if aframe.planes() > 0 {
aframe.set_rate(44100); aframe.set_channels(2);
aframe.set_pts(Some(frame)); aframe.set_rate(44100);
let aplane: &mut [(i16, i16)] = aframe.plane_mut(0); aframe.set_pts(Some(frame));
eprintln!("Audio buffer length {} -> {}", self.audio_buf.len(), aplane.len()); let aplane: &mut [(i16, i16)] = aframe.plane_mut(0);
aplane.copy_from_slice(self.audio_buf.as_ref()); eprintln!("Audio buffer length {} -> {}", self.audio_buf.len(), aplane.len());
//eprintln!("src: {:?}, dest: {:?}", self.audio_buf, aplane); aplane.copy_from_slice(self.audio_buf.as_ref());
self.audio_buf.clear(); //eprintln!("src: {:?}, dest: {:?}", self.audio_buf, aplane);
self.audio_buf.clear();
eprintln!("frame audio: {:?}", aframe); eprintln!("frame audio: {:?}", aframe);
eprintln!("🎞 queue frame pts {:?}", aframe.pts()); eprintln!("🎞 queue frame pts {:?}", aframe.pts());
self.audio_filter.get("in").unwrap().source().add(&aframe).unwrap(); self.audio_filter.get("in").unwrap().source().add(&aframe).unwrap();
let mut filtered_aframe = frame::Audio::empty(); let mut filtered_aframe = frame::Audio::empty();
loop { loop {
match self.audio_filter.get("out").unwrap().sink().frame(&mut filtered_aframe) { match self.audio_filter.get("out").unwrap().sink().frame(&mut filtered_aframe) {
Ok(..) => { Ok(..) => {
eprintln!("🔊 Got filtered audio frame {:?} pts {:?}", filtered_aframe, filtered_aframe.pts()); eprintln!("🔊 Got filtered audio frame {:?} pts {:?}", filtered_aframe, filtered_aframe.pts());
if self.audio_filter.get("in").unwrap().source().failed_requests() > 0 { if self.audio_filter.get("in").unwrap().source().failed_requests() > 0 {
println!("🎥 failed to put filter input frame"); println!("🎥 failed to put filter input frame");
}
//let faplane: &[f32] = filtered_aframe.plane(0);
//filtered_aframe.set_pts(Some(frame));
self.audio_encoder.send_frame(&filtered_aframe).unwrap();
self.receive_and_write_packets(EncoderToWriteFrom::Audio);
},
Err(e) => {
eprintln!("Error getting filtered audio frame: {:?}", e);
break;
} }
//let faplane: &[f32] = filtered_aframe.plane(0);
//filtered_aframe.set_pts(Some(frame));
self.audio_encoder.send_frame(&filtered_aframe).unwrap();
self.receive_and_write_packets(EncoderToWriteFrom::Audio);
},
Err(e) => {
eprintln!("Error getting filtered audio frame: {:?}", e);
break;
} }
} }
} }