无法播放Libavcodec(ffmpeg)编码示例的视频输出

时间:2018-11-15 22:46:21

标签: c video ffmpeg video-encoding libavcodec

在FFMPEG的GitHub上,我使用encode_video.c生成1秒的视频。这是有问题的示例:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/encode_video.c

我使用以下语言进行编译:{{1​​}}

干净编译,零警告。

我通过运行gcc -Wall -o ffencode encode_video.c -lavcodec -lavutil -lz -lm

来测试程序

打印出许多统计信息(根据源代码预期)以及ffmpeg日志,但最终没有错误或警告。

但是,生成的输出./ffencode video.mp4 libx264仅可以由video.mp4播放,并且VLC Player(以及Google Chrome)无法播放视频。

通过ffplay命令行播放它实际上会打印:

vlc

查看[00007ffd3550fec0] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface. TagLib: MP4: Invalid atom size TagLib: MP4: Invalid atom size TagLib: MP4: Invalid atom size 的输出,比特率和持续时间字段为空:

ffprobe

我使用具有以下配置的ffmpeg 4.1:

Input #0, h264, from 'video.mp4':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 352x288, 25 fps, 25 tbr, 1200k tbn, 50 tbc

有什么办法解决此问题吗?看到API的官方示例缺少此类基本信息,这真令人惊讶。

3 个答案:

答案 0 :(得分:0)

该示例生成原始比特流-它不是MP4。该示例仅用于说明编码,而不用于混合(用于将一个或多个流打包为MP4等容器文件格式的术语)。

将扩展名重命名为.h264并使用VLC进行测试。不知道Chrome是否支持原始.h264文件。

要从此输出生成MP4,请运行

ffmpeg -i video.mp4 -c copy actually.mp4

答案 1 :(得分:0)

您需要将视频流混合到视频容器中,例如.mp4。木星的东西保存在libavformat中。算法应该像这样:

  • 通过调用av_register_all或手动注册感兴趣的格式来初始化格式库。
  • 通过调用avformat_alloc_context
  • 创建合并上下文
  • 通过调用avformat_new_stream
  • 创建一个或多个媒体流
  • 通过调用avformat_write_header
  • 编写标题
  • 通过调用av_write_frame
  • 写入媒体数据
  • 通过调用av_write_trailer
  • 编写预告片
  • 通过调用avformat_free_context破坏混合环境

答案 2 :(得分:-1)

只能由ffplay播放,并且VLC Player(以及Google Chrome)无法播放视频。 由于ffplay可以播放视频,因此其他媒体播放器可以播放它。您需要将vlc配置为读取X264编码的视频。转到首选项,全选并将多路分配器更改为视频H264