mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-01 15:49:51 +08:00
obs-ffmpeg: Implement get_total_bytes in recording outputs
Allows seeing statistics such as bitrate and total bytes saved for recording outputs.
This commit is contained in:
@@ -39,6 +39,7 @@ struct ffmpeg_muxer {
|
||||
obs_output_t *output;
|
||||
os_process_pipe_t *pipe;
|
||||
int64_t stop_ts;
|
||||
uint64_t total_bytes;
|
||||
struct dstr path;
|
||||
bool sent_headers;
|
||||
volatile bool active;
|
||||
@@ -292,6 +293,7 @@ static bool ffmpeg_mux_start(void *data)
|
||||
/* write headers and start capture */
|
||||
os_atomic_set_bool(&stream->active, true);
|
||||
os_atomic_set_bool(&stream->capturing, true);
|
||||
stream->total_bytes = 0;
|
||||
obs_output_begin_data_capture(stream->output, 0);
|
||||
|
||||
info("Writing file '%s'...", stream->path.array);
|
||||
@@ -374,6 +376,7 @@ static bool write_packet(struct ffmpeg_muxer *stream,
|
||||
return false;
|
||||
}
|
||||
|
||||
stream->total_bytes += packet->size;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -460,6 +463,12 @@ static obs_properties_t *ffmpeg_mux_properties(void *unused)
|
||||
return props;
|
||||
}
|
||||
|
||||
static uint64_t ffmpeg_mux_total_bytes(void *data)
|
||||
{
|
||||
struct ffmpeg_muxer *stream = data;
|
||||
return stream->total_bytes;
|
||||
}
|
||||
|
||||
struct obs_output_info ffmpeg_muxer = {
|
||||
.id = "ffmpeg_muxer",
|
||||
.flags = OBS_OUTPUT_AV |
|
||||
@@ -471,6 +480,7 @@ struct obs_output_info ffmpeg_muxer = {
|
||||
.start = ffmpeg_mux_start,
|
||||
.stop = ffmpeg_mux_stop,
|
||||
.encoded_packet = ffmpeg_mux_data,
|
||||
.get_total_bytes= ffmpeg_mux_total_bytes,
|
||||
.get_properties = ffmpeg_mux_properties
|
||||
};
|
||||
|
||||
@@ -542,6 +552,7 @@ static bool replay_buffer_start(void *data)
|
||||
|
||||
os_atomic_set_bool(&stream->active, true);
|
||||
os_atomic_set_bool(&stream->capturing, true);
|
||||
stream->total_bytes = 0;
|
||||
obs_output_begin_data_capture(stream->output, 0);
|
||||
|
||||
return true;
|
||||
@@ -811,5 +822,6 @@ struct obs_output_info replay_buffer = {
|
||||
.start = replay_buffer_start,
|
||||
.stop = ffmpeg_mux_stop,
|
||||
.encoded_packet = replay_buffer_data,
|
||||
.get_total_bytes= ffmpeg_mux_total_bytes,
|
||||
.get_defaults = replay_buffer_defaults
|
||||
};
|
||||
|
||||
@@ -91,6 +91,8 @@ struct ffmpeg_output {
|
||||
bool connecting;
|
||||
pthread_t start_thread;
|
||||
|
||||
uint64_t total_bytes;
|
||||
|
||||
uint64_t audio_start_ts;
|
||||
uint64_t video_start_ts;
|
||||
uint64_t stop_ts;
|
||||
@@ -893,6 +895,8 @@ static int process_packet(struct ffmpeg_output *output)
|
||||
}
|
||||
}
|
||||
|
||||
output->total_bytes += packet.size;
|
||||
|
||||
ret = av_interleaved_write_frame(output->ff_data.output, &packet);
|
||||
if (ret < 0) {
|
||||
av_free_packet(&packet);
|
||||
@@ -1051,6 +1055,7 @@ static bool ffmpeg_output_start(void *data)
|
||||
os_atomic_set_bool(&output->stopping, false);
|
||||
output->audio_start_ts = 0;
|
||||
output->video_start_ts = 0;
|
||||
output->total_bytes = 0;
|
||||
|
||||
ret = pthread_create(&output->start_thread, NULL, start_thread, output);
|
||||
return (output->connecting = (ret == 0));
|
||||
@@ -1100,6 +1105,12 @@ static void ffmpeg_deactivate(struct ffmpeg_output *output)
|
||||
ffmpeg_data_free(&output->ff_data);
|
||||
}
|
||||
|
||||
static uint64_t ffmpeg_output_total_bytes(void *data)
|
||||
{
|
||||
struct ffmpeg_output *output = data;
|
||||
return output->total_bytes;
|
||||
}
|
||||
|
||||
struct obs_output_info ffmpeg_output = {
|
||||
.id = "ffmpeg_output",
|
||||
.flags = OBS_OUTPUT_AUDIO | OBS_OUTPUT_VIDEO,
|
||||
@@ -1110,4 +1121,5 @@ struct obs_output_info ffmpeg_output = {
|
||||
.stop = ffmpeg_output_stop,
|
||||
.raw_video = receive_video,
|
||||
.raw_audio = receive_audio,
|
||||
.get_total_bytes = ffmpeg_output_total_bytes,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user