Reputation: 1
I tried to create a pipeline to simultaneously play a mp4 to mp4. Here is the gst-launch command for the same:
gst-launch-1.0 filesrc location="/home/usr/Downloads/mp4dir/animate1.mp4" ! decodebin name=demux demux. ! queue ! tee name=aud_tee aud_tee. ! queue ! audioconvert ! audioresample ! autoaudiosink aud_tee. ! queue ! audioconvert ! audioresample ! avenc_aac ! aacparse ! mp4mux name=muxer muxer. ! filesink location="/home/usr/Downloads/output.mp4" demux. ! queue ! tee name=vid_tee vid_tee. ! queue ! videoconvert ! autovideosink vid_tee. ! queue ! videoconvert ! x264enc ! muxer.
For the gst-launch statment I expected to both convert and play the video simultaneously but instead it gets stuck and a corrupt output is created in the filesink location.
Upvotes: 0
Views: 549
Reputation: 437
I tried to make sense of your pipline by adding line breaks.
gst-launch-1.0 -v -e \
filesrc location="/home/usr/Downloads/mp4dir/animate1.mp4" \
! decodebin name=demux \
\
demux. ! queue ! tee name=aud_tee \
aud_tee. ! queue ! audioconvert ! audioresample ! autoaudiosink \
aud_tee. ! queue ! audioconvert ! audioresample ! avenc_aac ! aacparse ! mp4muxname=muxer \
\
muxer. ! filesink location="/home/usr/Downloads/output.mp4" \
\
demux. ! queue ! tee name=vid_tee \
vid_tee. ! queue ! videoconvert ! autovideosink \
vid_tee. ! queue ! videoconvert ! x264enc ! muxer.
Which I think can be more elegantly written like this
gst-launch-1.0 -v -e \
filesrc location="/home/usr/Downloads/mp4dir/animate1.mp4" \
! decodebin name=demux \
\
tee name=aud_tee \
tee name=vid_tee \
demux. ! aud_tee. \
demux. ! vid_tee. \
\
aud_tee. ! queue ! autoaudiosink \
vid_tee. ! queue ! autovideosink \
\
mp4muxname=muxer \
aud_tee. ! queue ! audioconvert ! audioresample ! avenc_aac ! .muxer \
vid_tee. ! queue ! videoconvert ! x264enc ! muxer. \
muxer. ! filesink location="/home/usr/Downloads/output.mp4"
You might benefit from using two multiqueues instead of using 4 independent queues, though it probably makes no functional difference, it helps keep track of what's happening where.
gst-launch-1.0 -v -e \
filesrc location="/home/usr/Downloads/mp4dir/animate1.mp4" \
! decodebin name=demux \
\
tee name=aud_tee \
tee name=vid_tee \
demux. ! aud_tee. \
demux. ! vid_tee. \
\
multiqueue name=playqueue \
multiqueue name=convqueue \
aud_tee. ! playqueue. \
aud_tee. ! convqueue. \
vid_tee. ! playqueue. \
vid_tee. ! convqueue. \
\
playqueue. ! autoaudiosink \
playqueue. ! autovideosink \
\
mp4muxname=muxer \
convqueue. ! audioconvert ! audioresample ! avenc_aac ! muxer. \
convqueue. ! videoconvert ! x264enc ! muxer. \
muxer. ! filesink location="/home/usr/Downloads/output.mp4"
When I tried this pipeline that used the multiqueue, i did not need to change the ASYNC setting to get a properly encoded file at output.mp4.
Note: The encode only finishes when the video playback finishes in my pipeline above. This could be improved to make the video encode run as fast as it can while playing the video on screen normally.
Upvotes: 0