[FFmpeg-devel] ? Inserting an image in the middle of a video stream
John P Poet
jppoet at gmail.com
Thu Apr 26 00:11:40 EEST 2018
Hi all,
I am working on a project where I need to insert a repeating image (10
seconds) in the middle of a video stream while also transcoding from one
video codec to another. The images are going to be either png or jpg
images. I have a frame number within the video stream which tells me where
to insert the sequence of image frames.
1) I have been looking over ffmpeg.c trying to figure out the best place to
perform this bit of "magic". It looks to me like I would need to modify
static int transcode_step(void)
such that if I determine I am at the insertion frame number, that I call a
new function to insert the image, instead of calling process_input(int
file_index). Something like:
if (ost->st->nb_frames == image_insert_frame_number) {
ret = process_image_input()
else
ret = process_input(ist->file_index);
Does that seem reasonable? If so, then I have to figure out how make my
"image frames" play nice with the rest of the transcode process.
2) I assume I would need to flush the input video stream at the point I
wish to insert the images. Then start reading from the video stream again
when the images have been processed.
3) process_input() and process_input_packet() seem to do a lot of work to
get the PTS and DTS correct. Since I am just processing images, can
someone tell me the easiest way to handle that? Is there anything special
I will have to do, there, when I resume transcoding the video source to
allow for the time my image frames have taken?
4) Is
static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output,
int64_t *duration_pts, int eof, int *decode_failed)
generic enough, that I can directly use it to process the packets I am
reading from the image file? The examples I have found for reading and
parsing image files, do not bother with creating an InputStream. If I
wanted to use decode_video() I would have to deal with that. It would be
nice if I could just call
static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
with my context for my image file, but I am guessing that I don't really
want it added to the "global list of input streams".
5) If decode_video() is not appropriate for me to call with my "image"
packets, then should I call ifilter_send_frame() directly? I have to
admit, I currently have no idea how to setup a "filter" for the images.
I am hoping someone can either point me to an example of doing this type of
operation, or can offer me some guidance. I have been doing a lot of
"googling" but it is hard to identify which "API" the examples I have
finding, where written against. I am using ffmpeg master for this project.
TIA,
John
More information about the ffmpeg-devel
mailing list