如何让GStreamer正确读取视频元信息损坏的FLV文件
FLV元数据损坏导致GStreamer无法播放的解决方案
问题描述
现有一批头部/元数据存在错误的FLV文件需要使用GStreamer播放,VLC和ffplay可通过自身兼容逻辑正常播放该类文件,但MediaInfo仅能展示不完整的视频信息:
Video Format : AVC Format/Info : Advanced Video Codec Codec ID : 7 Duration : 12 s 633 ms Frame rate mode : Constant Frame rate : 60.000 FPS Bit depth : 8 bits
正常的FLV文件至少还会展示格式profile和level信息。gst-discoverer-1.0完全无法正常检测该类文件的视频流,输出信息如下:
Properties: Duration: 0:00:00.116000000 Seekable: yes Live: no container: Flash audio: MPEG-4 AAC Stream ID: a72c1038e0bf52d7668cb945588d7bca2547bd58212aa7f08db439aeadfcbd95/audio Language: <unknown> Channels: 2 (front-left, front-right) Sample rate: 48000 Depth: 32 Bitrate: 0 Max bitrate: 0 video: H.264 Stream ID: (NULL) Width: 0 Height: 0 Depth: 0 Frame rate: 0/1 Pixel aspect ratio: 1/1 Interlaced: false Bitrate: 0 Max bitrate: 0
gst-play-1.0启动后会报错,无法输出视频画面,报错信息如下:
gst-play-1.0.exe "C:\Users\me\Downloads\custom.flv" Press 'k' to see a list of keyboard shortcuts. Now playing C:\Users\me\Downloads\custom.flv WARNING No decoder available for type 'video/x-h264, stream-format=(string)avc, codec_data=(buffer)000000016742c020da014016ec0440000003004000001e03c60ca80000000168ce3c80'. WARNING debug information: ../gst/playback/gsturidecodebin.c(960): unknown_type_cb (): /GstPlayBin:playbin/GstURIDecodeBin:uridecodebin0 Redistribute latency... 0:00:12.6 / 0:00:12.6 Reached end of play list.
解决方案
方案1:无需修改文件,直接用GStreamer播放
- 先确认已经安装完整的GStreamer插件集,包括
gst-plugins-bad、gst-plugins-ugly和gst-libav,缺失avdec_h264解码器会直接导致找不到解码器的报错。 - 手动构造播放管道,强制从实际码流中提取元数据,不依赖错误的FLV头信息,命令示例如下:
gst-launch-1.0 filesrc location=你的文件路径.flv ! flvdemux name=demux \ demux.video ! h264parse ! avdec_h264 ! videoconvert ! autovideosink \ demux.audio ! aacparse ! avdec_aac ! audioconvert ! autoaudiosink
该管道使用和ffplay同源的libav解码器,加上h264parse组件主动从H.264码流中读取SPS/PPS、分辨率等正确信息,绕过FLV头的错误元数据完成播放。
方案2:批量修复文件元数据
使用ffmpeg直接转封装,不需要重新编码,处理速度极快,能自动修正头信息:
ffmpeg -i 输入损坏文件.flv -c copy 输出修复后.flv
ffmpeg会自动从实际音视频码流中提取正确的参数,重新写入FLV文件头,修复后的文件可直接被gst-discoverer-1.0、gst-play-1.0正常识别和播放。
内容的提问来源于stack exchange,提问作者Anton Serov
相关产品推荐
相关产品推荐

