Recover H264 encoded ts segments that dont have PPS/SPS

Guru Govindan gurunathan.govindan at gmail.com
Thu May 4 01:15:46 UTC 2023


Hi Nicolas,
Thanks for your response, I figured out a way to extract the h264 header by
making another connection to the camera and extracting data from the first
stream. I used help from here
https://stackoverflow.com/questions/24884827/possible-locations-for-sequence-picture-parameter-sets-for-h-264-stream/24890903#24890903

I also verified that the extracted header is valid by running `ffmpeg -i
header1.h264 -an -c:v copy -bsf:v trace_headers -f null` and verified that
it is a valid h264 file and contains SPS and PPS values.

However when I cat the recovered header and copy the truncated file, it
says it is not a valid file.

Any ideas? Should it be inserted before every keyframe and not just in
front of the file?


On Wed, May 3, 2023 at 12:47 PM Nicolas Dufresne <nicolas at ndufresne.ca>
wrote:

> Le mercredi 03 mai 2023 à 10:22 -0700, Guru Govindan via gstreamer-devel a
> écrit :
>
> Hi There,
> I am having an issue where a lot of video footage from a security camera
> was recorded without the sprop-parameters-set (SPS/PPS).
>
> I am unable to play or transcode these ts files as it does not have
> SPS/PPS values.
>
> I tried the following by sending the h264parse the stream format but that
> failed
>
>
> The only way to recover is to find the origin SPS/PPS, note, this is
> static on most cameras. The sprop-parameters contains it, just it may need
> to be transformed. Then something like this may work, but never tried`
>
> gst-launch-1.0 \
>   filesrc location=truncated.ts ! tsdemux ! filesink
> location=truncated.h264
> cat recovered-header.h264 > fixed.h264
> cat truncated.h264 >> fixed.h264
> gst-launch-1.0 \
>   filesrc location=fixed.h264 ! h264parse ! mpegtsmux ! filesink
> location=fixed.ts
>
> This is video only though, totally untested.
>
> Nicolas
>
>
> ```
> gst-launch-1.0 -v filesrc location=2.ts ! tsparse ! tsdemux name=demux
> demux. ! queue ! h264parse ! video/x-h264,stream-format=avc,alignment=au !
> decodebin ! videoconvert ! vaapih264enc ! h264parse ! mpegtsmux
> alignment=-1 ! filesink location=output.ts
> ```
> failed with /
> GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:sink: caps =
> video/x-h264, stream-format=(string)byte-stream
> ERROR: from element /GstPipeline:pipeline0/GstH264Parse:h264parse0: No
> valid frames found before end of stream
>
> I then tried to split it as per keyframes and then mux it.. like below but
> that failed as well
>
> ```
> gst-launch-1.0 -v filesrc location=2.ts ! tsdemux name=demux ! h264parse !
> splitmuxsink max-size-time=1000000000 location=segment%02d.ts mpegtsmux
> name=mux ! filesink location=output.ts demux.video_0 ! queue ! mux.
> ```
> failed with h264parse0: No valid frames found before end of stream
>
> Since it could not find EOS.. I thoiught of sending the entire manifest..
> but that didnt work as well
>
> ```
> gst-launch-1.0 -v filesrc location="<manifest uri>" ! hlsdemux ! h264parse
> ! video/x-h264,stream-format='(string)avc,alignment=(string)au' ! mpegtsmux
> ! h264parse config-interval=-1 ! mpegtsmux ! filesink location=output.ts
> ```
>
> Just like how we can add config-interval to a rtp stream, is there a way
> to add it to a ts segment?
>
> Best Regards,
> Guru
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20230503/02d3741b/attachment.htm>


More information about the gstreamer-devel mailing list