使用ffmpeg从mp4或flv中提取h264原始视频流生成无效流

Posted

技术标签:

【中文标题】使用ffmpeg从mp4或flv中提取h264原始视频流生成无效流【英文标题】:extracting h264 raw video stream from mp4 or flv with ffmpeg generate an invalid stream 【发布时间】:2013-10-18 11:36:33 【问题描述】:

我正在尝试使用 ffmpeg 从 mp4 或 flv h264 视频(youtube 视频)中提取视频流。原视频(test.flv)用 ffplay 播放没有问题,ffprobe 报错如下:

ffprobe version N-55515-gbbbd959 Copyright (c) 2007-2013 the FFmpeg developers
built on Aug 13 2013 18:06:32 with gcc 4.7.3 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-
amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --
enable-libxvid --enable-zlib
  libavutil      52. 42.100 / 52. 42.100
  libavcodec     55. 27.100 / 55. 27.100
  libavformat    55. 13.102 / 55. 13.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 82.100 /  3. 82.100
  libswscale      2.  4.100 /  2.  4.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
[flv @ 000000000031ea80] Stream discovered after head already parsed
Input #0, flv, from 'test.flv':
  Metadata:
    starttime       : 0
    totalduration   : 142
    totaldatarate   : 692
    bytelength      : 12286492
    canseekontime   : true
    sourcedata      : B42B95507HH1381414522145462
    purl            :
    pmsg            :
  Duration: 00:02:22.02, start: 0.000000, bitrate: 692 kb/s
    Stream #0:0: Video: h264 (Main), yuv420p, 640x268, 568 kb/s, 23.98 tbr, 1k t
bn, 47.95 tbc
    Stream #0:1: Audio: aac, 44100 Hz, stereo, fltp, 131 kb/s
    Stream #0:2: Data: none
Unsupported codec with id 0 for input stream 2

为了摆脱额外的流(我只需要视频),我使用了以下 ffmpeg 命令行:

ffmpeg -i test.flv -map 0:0 -vcodec copy -an -f h264 test.h264

包括 ffplay 在内的任何播放器都无法读取新的流,并且 ffprobe 会出现错误: test.h264: 处理 inputq= 0B f=0/0 时发现无效数据

有人知道我做错了什么吗?

我还尝试了更简单的 youtube 命令行:

ffmpeg -i test.flv -vcodec copy -an test.h264

如果我使用其他格式(例如 avi):

ffmpeg -i test.flv -vcodec copy -an test.avi

输出视频有效。

如果我对视频进行转码

ffmpeg -i test.flv -an test.h264

输出也有效

有什么建议吗?

【问题讨论】:

尝试类似 -vfbs h264_mp4toannexb 。在输出之前添加该选项。 您应该始终包含完整的 ffmpeg 控制台输出,而不仅仅是部分。 我编辑了我的问题以添加完整的控制台输出。实际上,@alexbuisson 过滤器指向的 -bsf:v h264_mp4toannexb 解决了这个问题。您可以将其添加为答案还是我应该这样做?谢谢!! ***.com/questions/10380045/… 【参考方案1】:

要从 MP4 或 FLV 容器中提取原始视频,您应该指定 -bsf:v h264_mp4toannexb-vbfs h264_mp4toannexb 选项。

ffmpeg -i test.flv -vcodec copy -an -bsf:v h264_mp4toannexb test.h264

没有H264 Annex B / NAL 的原始流无法被播放器解码。使用该选项,ffmpeg 对 NAL 单元中的每个 h264 样本执行简单的“复用”。

【讨论】:

以上是关于使用ffmpeg从mp4或flv中提取h264原始视频流生成无效流的主要内容,如果未能解决你的问题,请参考以下文章

从 MP4/FLV 中提取帧?

(原)从mp4,flv文件中解析出h264和aac,送解码器解码失败

ffmpeg_拼接并提取flv视频文件中的音频生成mp3文件

FFmpeg 命令行工具ffmpeg

如何将 H264 包装到 mp4 容器中?

使用 FFMpeg 将 FLV 流式传输到 RTMP,使用 H264 编解码器和 C++ API 到 flv.js