28 #include "../include/ChunkWriter.h" 33 local_reader(reader), path(path), chunk_size(24*3), chunk_count(1), frame_count(1), is_writing(false),
34 default_extension(
".webm"), default_vcodec(
"libvpx"), default_acodec(
"libvorbis"), last_frame_needed(false), is_open(false)
47 write_json_meta_data();
54 string ChunkWriter::get_chunk_path(int64_t chunk_number,
string folder,
string extension)
57 stringstream chunk_count_string;
58 chunk_count_string << chunk_number;
59 QString padded_count =
"%1";
60 padded_count = padded_count.arg(chunk_count_string.str().c_str(), 6,
'0');
61 if (folder.length() != 0 && extension.length() != 0)
63 return QDir::cleanPath(QString(path.c_str()) + QDir::separator() + folder.c_str() + QDir::separator() + padded_count + extension.c_str()).toStdString();
65 else if (folder.length() == 0 && extension.length() != 0)
67 return QDir::cleanPath(QString(path.c_str()) + QDir::separator() + padded_count + extension.c_str()).toStdString();
69 else if (folder.length() != 0 && extension.length() == 0)
71 return QDir::cleanPath(QString(path.c_str()) + QDir::separator() + folder.c_str()).toStdString();
81 throw WriterClosed(
"The ChunkWriter is closed. Call Open() before calling this method.", path);
87 frame->Save(get_chunk_path(chunk_count,
"",
".jpeg"), 1.0);
90 create_folder(get_chunk_path(chunk_count,
"final",
""));
91 writer_final =
new FFmpegWriter(get_chunk_path(chunk_count,
"final", default_extension));
96 create_folder(get_chunk_path(chunk_count,
"preview",
""));
97 writer_preview =
new FFmpegWriter(get_chunk_path(chunk_count,
"preview", default_extension));
102 create_folder(get_chunk_path(chunk_count,
"thumb",
""));
103 writer_thumb =
new FFmpegWriter(get_chunk_path(chunk_count,
"thumb", default_extension));
119 last_frame_needed =
true;
124 if (last_frame_needed)
142 last_frame_needed =
false;
155 if (frame_count % chunk_size == 0 && frame_count >= chunk_size)
157 cout <<
"Done with chunk" << endl;
158 cout <<
"frame_count: " << frame_count << endl;
159 cout <<
"chunk_size: " << chunk_size << endl;
162 for (
int z = 0; z<12; z++)
176 writer_final->
Close();
177 writer_preview->
Close();
178 writer_thumb->
Close();
199 for (int64_t number = start; number <= length; number++)
202 std::shared_ptr<Frame> f = reader->
GetFrame(number);
213 for (int64_t number = start; number <= length; number++)
216 std::shared_ptr<Frame> f = local_reader->
GetFrame(number);
229 cout <<
"Final chunk" << endl;
230 cout <<
"frame_count: " << frame_count << endl;
231 cout <<
"chunk_size: " << chunk_size << endl;
234 for (
int z = 0; z<12; z++)
248 writer_final->
Close();
249 writer_preview->
Close();
250 writer_thumb->
Close();
267 local_reader->
Close();
271 void ChunkWriter::write_json_meta_data()
274 string json_path = QDir::cleanPath(QString(path.c_str()) + QDir::separator() +
"info.json").toStdString();
278 myfile.open (json_path.c_str());
279 myfile << local_reader->
Json() << endl;
284 void ChunkWriter::create_folder(
string path)
286 QDir dir(path.c_str());
293 bool ChunkWriter::is_chunk_valid()
ChunkWriter(string path, ReaderBase *reader)
Constructor for ChunkWriter. Throws one of the following exceptions.
int channels
The number of audio channels used in the audio stream.
WriterInfo info
Information about the current media file.
int video_bit_rate
The bit rate of the video stream (in bytes)
Fraction pixel_ratio
The pixel ratio of the video stream as a fraction (i.e. some pixels are not square) ...
void CopyReaderInfo(ReaderBase *reader)
This method copy's the info struct of a reader, and sets the writer with the same info...
This class represents a single frame of video (i.e. image & audio data)
string acodec
The name of the audio codec used to encode / decode the video stream.
This class uses the FFmpeg libraries, to write and encode video files and audio files.
string vcodec
The name of the video codec used to encode / decode the video stream.
virtual void Close()=0
Close the reader (and any resources it was consuming)
This abstract class is the base class, used by all readers in libopenshot.
int width
The width of the video (in pixels)
void WriteFrame(std::shared_ptr< Frame > frame)
Add a frame to the stack waiting to be encoded.
void SetVideoOptions(bool has_video, string codec, Fraction fps, int width, int height, Fraction pixel_ratio, bool interlaced, bool top_field_first, int bit_rate)
Set video export options.
virtual std::shared_ptr< Frame > GetFrame(int64_t number)=0
void WriteTrailer()
Write the file trailer (after all frames are written). This is called automatically by the Close() me...
void WriteHeader()
Write the file header (after the options are set). This method is called automatically by the Open() ...
void Close()
Close the writer.
int sample_rate
The number of audio samples per second (44100 is a common sample rate)
Fraction fps
Frames per second, as a fraction (i.e. 24/1 = 24 fps)
This namespace is the default namespace for all code in the openshot library.
virtual string Json()=0
Get and Set JSON methods.
void SetAudioOptions(bool has_audio, string codec, int sample_rate, int channels, ChannelLayout channel_layout, int bit_rate)
Set audio export options.
void WriteFrame(std::shared_ptr< Frame > frame)
Add a frame to the stack waiting to be encoded.
Exception when a writer is closed, and a frame is requested.
ChannelLayout channel_layout
The channel layout (mono, stereo, 5 point surround, etc...)
void PrepareStreams()
Prepare & initialize streams and open codecs. This method is called automatically by the Open() metho...
int height
The height of the video (in pixels)
void Close()
Close the writer.
virtual void Open()=0
Open the reader (and start consuming resources, such as images or video files)