diff --git a/include/Frame.h b/include/Frame.h
index e2025b59..a603208f 100644
--- a/include/Frame.h
+++ b/include/Frame.h
@@ -204,6 +204,9 @@ namespace openshot
/// Display the wave form
void DisplayWaveform();
+ /// Get magnitude of range of samples (if channel is -1, return average of all channels for that sample)
+ float GetAudioSample(int channel, int sample, int magnitude_range);
+
/// Get an array of sample data
float* GetAudioSamples(int channel);
@@ -216,7 +219,7 @@ namespace openshot
/// Get number of audio channels
int GetAudioChannelsCount();
- /// Get number of audio channels
+ /// Get number of audio samples
int GetAudioSamplesCount();
juce::AudioSampleBuffer *GetAudioSampleBuffer();
diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp
index dce20e41..b27cea13 100644
--- a/src/FFmpegReader.cpp
+++ b/src/FFmpegReader.cpp
@@ -537,7 +537,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame)
ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::ReadStream (GetNextPacket)", "requested_frame", requested_frame, "processing_video_frames.size()", processing_video_frames.size(), "processing_audio_frames.size()", processing_audio_frames.size(), "minimum_packets", minimum_packets, "packets_processed", packets_processed, "", -1);
// Video packet
- if (packet->stream_index == videoStream)
+ if (info.has_video && packet->stream_index == videoStream)
{
// Reset this counter, since we have a video packet
num_packets_since_video_frame = 0;
@@ -572,7 +572,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame)
}
// Audio packet
- else if (packet->stream_index == audioStream)
+ else if (info.has_audio && packet->stream_index == audioStream)
{
// Increment this (to track # of packets since the last video packet)
num_packets_since_video_frame++;
diff --git a/src/Frame.cpp b/src/Frame.cpp
index bb1bca7e..d8b4123f 100644
--- a/src/Frame.cpp
+++ b/src/Frame.cpp
@@ -296,6 +296,19 @@ void Frame::DisplayWaveform()
ClearWaveform();
}
+// Get magnitude of range of samples (if channel is -1, return average of all channels for that sample)
+float Frame::GetAudioSample(int channel, int sample, int magnitude_range)
+{
+ if (channel > 0) {
+ // return average magnitude for a specific channel/sample range
+ return audio->getMagnitude(channel, sample, magnitude_range);
+
+ } else {
+ // Return average magnitude for all channels
+ return audio->getMagnitude(sample, magnitude_range);
+ }
+}
+
// Get an array of sample data
float* Frame::GetAudioSamples(int channel)
{
diff --git a/src/Qt/VideoPlaybackThread.cpp b/src/Qt/VideoPlaybackThread.cpp
index 4b6d0af2..0e6d0e55 100644
--- a/src/Qt/VideoPlaybackThread.cpp
+++ b/src/Qt/VideoPlaybackThread.cpp
@@ -58,20 +58,17 @@ namespace openshot
// Make other threads wait on the render event
bool need_render = render.wait(500);
- if (need_render)
+ if (need_render && frame)
{
// Debug
ZmqLogger::Instance()->AppendDebugMethod("VideoPlaybackThread::run (before render)", "frame->number", frame->number, "need_render", need_render, "", -1, "", -1, "", -1, "", -1);
// Render the frame to the screen
renderer->paint(frame);
-
- // Signal to other threads that the rendered event has completed
- rendered.signal();
-
- // Debug
- ZmqLogger::Instance()->AppendDebugMethod("VideoPlaybackThread::run (after render)", "frame->number", frame->number, "need_render", need_render, "", -1, "", -1, "", -1, "", -1);
}
+
+ // Signal to other threads that the rendered event has completed
+ rendered.signal();
}
return;