diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp
index 3de4408b..91b2affe 100644
--- a/src/FFmpegWriter.cpp
+++ b/src/FFmpegWriter.cpp
@@ -561,7 +561,12 @@ void FFmpegWriter::flush_encoders()
cout << "Flushing AUDIO buffer!" << endl;
// Increment PTS (in samples and scaled to the codec's timebase)
- write_audio_count += av_rescale_q(audio_codec->frame_size / audio_codec->channels, (AVRational){1, info.sample_rate}, audio_codec->time_base);
+#if LIBAVFORMAT_VERSION_MAJOR >= 54
+ // for some reason, it requires me to multiply channels X 2
+ write_audio_count += av_rescale_q(audio_input_position / (audio_codec->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)), (AVRational){1, info.sample_rate}, audio_codec->time_base);
+#else
+ write_audio_count += av_rescale_q(audio_input_position / audio_codec->channels, (AVRational){1, info.sample_rate}, audio_codec->time_base);
+#endif
AVPacket pkt;
av_init_packet(&pkt);
@@ -980,7 +985,8 @@ void FFmpegWriter::write_audio_packets(bool final)
audio_resample(resampleCtx, (short *) converted_audio, (short *) frame_samples, total_frame_samples);
// Update total frames & input frame size (due to bigger or smaller data types)
- total_frame_samples *= (av_get_bytes_per_sample(audio_codec->sample_fmt) / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16));
+ total_frame_samples *= (av_get_bytes_per_sample(audio_codec->sample_fmt) / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)); // adjust for different byte sizes
+ total_frame_samples *= (float(info.channels) / channels_in_frame); // adjust for different # of channels
audio_input_frame_size = initial_audio_input_frame_size * (av_get_bytes_per_sample(audio_codec->sample_fmt) / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16));
// Set remaining samples
@@ -1022,11 +1028,22 @@ void FFmpegWriter::write_audio_packets(bool final)
break;
// Increment PTS (in samples and scaled to the codec's timebase)
+#if LIBAVFORMAT_VERSION_MAJOR >= 54
+ // for some reason, it requires me to multiply channels X 2
+ write_audio_count += av_rescale_q(audio_input_position / (audio_codec->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)), (AVRational){1, info.sample_rate}, audio_codec->time_base);
+#else
write_audio_count += av_rescale_q(audio_input_position / audio_codec->channels, (AVRational){1, info.sample_rate}, audio_codec->time_base);
+#endif
// Create AVFrame (and fill it with samples)
AVFrame *frame_final = avcodec_alloc_frame();
- frame_final->nb_samples = audio_input_frame_size / audio_codec->channels; //av_get_bytes_per_sample(audio_codec->sample_fmt);
+#if LIBAVFORMAT_VERSION_MAJOR >= 54
+ // for some reason, it requires me to multiply channels X 2
+ frame_final->nb_samples = audio_input_position / (audio_codec->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16));
+#else
+ frame_final->nb_samples = audio_input_frame_size / audio_codec->channels;
+#endif
+ //frame_final->nb_samples = audio_input_frame_size / audio_codec->channels; //av_get_bytes_per_sample(audio_codec->sample_fmt);
frame_final->pts = write_audio_count; // Set the AVFrame's PTS
avcodec_fill_audio_frame(frame_final, audio_codec->channels, audio_codec->sample_fmt, (uint8_t *) samples,
audio_input_position * av_get_bytes_per_sample(audio_codec->sample_fmt), 1);
@@ -1136,12 +1153,10 @@ void FFmpegWriter::process_video_packet(tr1::shared_ptr frame)
// Determine the height & width of the source image
int source_image_width = frame->GetWidth();
int source_image_height = frame->GetHeight();
- // If visualizing waveform (replace image with waveform image)
- if (info.visualize)
- {
- source_image_width = info.width;
- source_image_height = info.height;
- }
+
+ // Do nothing if size is 1x1 (i.e. no image in this frame)
+ if (source_image_height == 1 && source_image_width == 1)
+ return;
// Init rescalers (if not initialized yet)
if (image_rescalers.size() == 0)
@@ -1191,10 +1206,6 @@ void FFmpegWriter::process_video_packet(tr1::shared_ptr frame)
av_free(frame_source->data[0]);
av_free(frame_source);
- if (info.visualize)
- // Deallocate the waveform's image (if needed)
- frame->ClearWaveform();
-
} // end task
}
diff --git a/src/Main.cpp b/src/Main.cpp
index 3cb5e0be..b058e3ca 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -61,10 +61,10 @@ int main()
// Add some clips
//Clip c1(new FFmpegReader("/home/jonathan/Apps/videcho_site/media/user_files/videos/bd0bf442-3221-11e2-8bf6-001fd00ee3aa.webm"));
//Clip c1(new FFmpegReader("/home/jonathan/Videos/Movie Music/02 - Shattered [Turn The Car Around] (Album Version).mp3"));
- FFmpegReader r1("/home/jonathan/Desktop/sintel.webm");
- Clip c1(new FFmpegReader("/home/jonathan/Videos/big-buck-bunny_trailer.webm"));
- Clip c2(new ImageReader("/home/jonathan/Desktop/Logo.png"));
- Clip c3(new FFmpegReader("/home/jonathan/Desktop/sintel.webm"));
+ FFmpegReader r1("../../src/examples/piano.wav");
+ Clip c1(new FFmpegReader("/home/jonathan/Videos/sintel_trailer-720p.mp4"));
+ Clip c2(new ImageReader("/home/jonathan/Desktop/logo.png"));
+ Clip c3(new FFmpegReader("/home/jonathan/Videos/sintel_trailer-720p.mp4"));
//Clip c3(new FFmpegReader("/home/jonathan/Videos/Movie Music/01 Whip It.mp3"));
c1.Position(0.0);
c1.gravity = GRAVITY_CENTER;
@@ -192,7 +192,7 @@ int main()
// Set options
//w.SetAudioOptions(true, "libmp3lame", 44100, 2, 128000, false);
- w.SetAudioOptions(true, "libvorbis", 44100, 2, 128000);
+ w.SetAudioOptions(true, "libvorbis", 48000, 2, 128000);
w.SetVideoOptions(true, "libvpx", Fraction(24,1), 624, 348, Fraction(1,1), false, false, 2000000);
// Prepare Streams
@@ -204,13 +204,13 @@ int main()
// Output stream info
w.OutputStreamInfo();
- for (int frame = 200; frame <= 400; frame++)
+ for (int frame = 1; frame <= 100; frame++)
{
tr1::shared_ptr f = r1.GetFrame(frame);
if (f)
{
//if (frame >= 13)
- // f->DisplayWaveform();
+ //f->DisplayWaveform();
// Write frame
cout << "queue frame " << frame << " (" << f->number << ", " << f << ")" << endl;