The following pipeline successfully creates an mp4 file that is playable.
gst-launch -v -e filesrc location="sample1.mp4" ! qtdemux name=demux ! queue ! nal2bytestream_h264 ! qtmux ! filesink location=sample2.mp4
If I create this pipeline programmatically, I can playback the output file:
pipeline = gst_pipeline_new ("my-pipeline");
src = gst_element_factory_make ("filesrc", "src");
demux = gst_element_factory_make ("qtdemux", "demux");
queuev = gst_element_factory_make ("queue", "queuev");
parse = gst_element_factory_make ("nal2bytestream_h264", "parse");
mux = gst_element_factory_make ("qtmux", "mux");
sink = gst_element_factory_make ("filesink", "sink");
g_object_set (G_OBJECT (src), "location", filename, NULL);
g_object_set (G_OBJECT (demux), "name", "demux", NULL);
g_object_set (G_OBJECT (sink), "location", fileout, NULL);
gst_bin_add_many(GST_BIN (pipeline), src, demux, queuev, parse, mux, sink, NULL);
gst_check(gst_element_link(src, demux));
gst_element_link_many(queuev, parse, mux, sink, NULL);
gst_pad_add_event_probe(gst_element_get_static_pad(mux,"src"), G_CALLBACK(drop_eos_probe), pipeline);
g_signal_connect (demux, "pad-added", G_CALLBACK (on_pad_added), queuev);
//gst_element_set_state(pipeline, GST_STATE_PLAYING);
BUT, when I try to record a segment of the original clip using the above pipeline and the following lines of code I cannot playback the new file:
gst_element_seek(data.pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
GST_SEEK_TYPE_SET, start * GST_SECOND, GST_SEEK_TYPE_SET, (end+2) * GST_SECOND);
gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
If I change the sink from filesink to v4l2sink, it will playback just the segment just fine.
Question: Why can't I playback a recorded segment of an mp4 file?
If I use MediaInfo to examine the output file it only sees that it is a QT file and not much more. So the mp4 container is somehow corrupt.
Jeff Lancaster