fix opus encoding

This commit is contained in:
2018-08-28 15:15:20 +02:00
parent 44c5d7e4e8
commit f07869518d

View File

@@ -101,11 +101,9 @@ fn transcoder<P: AsRef<Path>>(
.next() .next()
.unwrap(), .unwrap(),
); );
encoder.set_bit_rate(decoder.bit_rate());
encoder.set_max_bit_rate(decoder.max_bit_rate());
encoder.set_time_base((1, decoder.rate() as i32)); encoder.set_time_base((1, 48_000));
output.set_time_base((1, decoder.rate() as i32)); output.set_time_base((1, 48_000));
let encoder = encoder.open_as(codec)?; let encoder = encoder.open_as(codec)?;
output.set_parameters(&encoder); output.set_parameters(&encoder);
@@ -120,17 +118,6 @@ fn transcoder<P: AsRef<Path>>(
}) })
} }
// Transcode the `best` audio stream of the input file into a the output file while applying a
// given filter. If no filter was specified the stream gets copied (`anull` filter).
//
// Example 1: Transcode *.mp3 file to *.wmv while speeding it up
// transcode-audio in.mp3 out.wmv "atempo=1.2"
//
// Example 2: Overlay an audio file
// transcode-audio in.mp3 out.mp3 "amovie=overlay.mp3 [ov]; [in][ov] amerge [out]"
//
// Example 3: Seek to a specified position (in seconds)
// transcode-audio in.mp3 out.mp3 anull 30
fn main() -> Result<(), ffmpeg::Error> { fn main() -> Result<(), ffmpeg::Error> {
ffmpeg::init()?; ffmpeg::init()?;
@@ -145,38 +132,30 @@ fn main() -> Result<(), ffmpeg::Error> {
octx.write_header()?; octx.write_header()?;
let in_time_base = transcoder.decoder.time_base(); let in_time_base = transcoder.decoder.time_base();
let out_time_base = octx.stream(0).unwrap().time_base();
let mut decoded = frame::Audio::empty(); let mut frame = frame::Audio::empty();
let mut encoded = ffmpeg::Packet::empty(); let mut encoded = ffmpeg::Packet::empty();
for (stream, mut packet) in ictx.packets() { for (stream, mut packet) in ictx.packets() {
if stream.index() == transcoder.stream { if stream.index() != transcoder.stream {
packet.rescale_ts(stream.time_base(), in_time_base); continue;
}
if let Ok(true) = transcoder.decoder.decode(&packet, &mut decoded) { packet.rescale_ts(stream.time_base(), in_time_base);
// let timestamp = decoded.timestamp();
// decoded.set_pts(timestamp);
transcoder if let Ok(true) = transcoder.decoder.decode(&packet, &mut frame) {
.filter transcoder.filter.get("in").unwrap().source().add(&frame)?;
.get("in")
.unwrap()
.source()
.add(&decoded)?;
while let Ok(..) = transcoder while let Ok(..) = transcoder
.filter .filter
.get("out") .get("out")
.unwrap() .unwrap()
.sink() .sink()
.frame(&mut decoded) .frame(&mut frame)
{ {
if let Ok(true) = transcoder.encoder.encode(&decoded, &mut encoded) { if let Ok(true) = transcoder.encoder.encode(&frame, &mut encoded) {
encoded.set_stream(0); encoded.set_stream(0);
encoded.rescale_ts(in_time_base, out_time_base); encoded.write_interleaved(&mut octx)?;
encoded.write_interleaved(&mut octx)?;
}
} }
} }
} }
@@ -189,18 +168,16 @@ fn main() -> Result<(), ffmpeg::Error> {
.get("out") .get("out")
.unwrap() .unwrap()
.sink() .sink()
.frame(&mut decoded) .frame(&mut frame)
{ {
if let Ok(true) = transcoder.encoder.encode(&decoded, &mut encoded) { if let Ok(true) = transcoder.encoder.encode(&frame, &mut encoded) {
encoded.set_stream(0); encoded.set_stream(0);
encoded.rescale_ts(in_time_base, out_time_base);
encoded.write_interleaved(&mut octx)?; encoded.write_interleaved(&mut octx)?;
} }
} }
if let Ok(true) = transcoder.encoder.flush(&mut encoded) { if let Ok(true) = transcoder.encoder.flush(&mut encoded) {
encoded.set_stream(0); encoded.set_stream(0);
encoded.rescale_ts(in_time_base, out_time_base);
encoded.write_interleaved(&mut octx)?; encoded.write_interleaved(&mut octx)?;
} }