c++ - 如何使用 FFmpeg C API 对 H.264 视频进行编码,然后使用媒体播放器打开输出?

标签 c++ c ffmpeg h.264 libx264

我正在尝试使用 FFMPEG C API 对 H.264 视频进行编码。 我已经成功编译并执行了 decoding/encoding example由 FFMPEG 提供。

我面临的问题是示例创建的 .mpg 文件(使用 AV_CODEC_ID_MPEG1VIDEO 编码)有效。 Windows 会创建缩略图和所有内容。另一方面,.h264(用 AV_CODEC_ID_H264 编码)文件没有。当我尝试在 VLC 中播放文件时,播放/暂停按钮只是闪烁,Windows 中没有缩略图,什么也没有。

在编码过程中,libx264 报告如下:

[libx264 @ 004b81a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 004b81a0] profile High, level 1.3
[libx264 @ 004b81a0] frame I:3     Avg QP:26.79  size:  2116
[libx264 @ 004b81a0] frame P:12    Avg QP:26.60  size:   789
[libx264 @ 004b81a0] frame B:10    Avg QP:31.39  size:   499
[libx264 @ 004b81a0] consecutive B-frames: 20.0% 80.0%
[libx264 @ 004b81a0] mb I  I16..4: 78.3% 11.6% 10.1%
[libx264 @ 004b81a0] mb P  I16..4: 77.4%  0.6%  0.1%  P16..4: 20.3%  0.7%  0.9%  0.0%  0.0%    skip: 0.0%
[libx264 @ 004b81a0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  9.4%  0.2%  0.0%  direct:11.0%  skip:79.4%  L0:25.4% L1:35.4% BI:39.2%
[libx264 @ 004b81a0] final ratefactor: 17.03
[libx264 @ 004b81a0] 8x8 transform intra:3.4% inter:31.3%
[libx264 @ 004b81a0] direct mvs  spatial:0.0% temporal:100.0%
[libx264 @ 004b81a0] coded y,uvDC,uvAC intra: 4.4% 35.8% 1.6% inter: 1.3% 34.5% 9.5%
[libx264 @ 004b81a0] i16 v,h,dc,p:  0%  0%  0% 100%
[libx264 @ 004b81a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 20% 17% 49%  0%  0%  0%  1%  6%
[libx264 @ 004b81a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14%  7% 18% 45%  2%  7%  2%  3%  2%
[libx264 @ 004b81a0] i8c dc,h,v,p:  2%  6%  4% 88%
[libx264 @ 004b81a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 004b81a0] ref P L0: 95.6%  1.6%  2.2%  0.5%  0.2%
[libx264 @ 004b81a0] ref B L0: 67.5% 28.5%  3.2%  0.8%
[libx264 @ 004b81a0] kb/s:166.45

“ffprobe.exe test.h264 -show_streams”返回

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=1/50
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=352
height=288
has_b_frames=1
sample_aspect_ratio=0:1
display_aspect_ratio=0:1
pix_fmt=yuv420p
level=13
timecode=N/A
id=N/A
r_frame_rate=50/2
avg_frame_rate=25/1
time_base=1/1200000
start_pts=N/A
start_time=N/A
duration_ts=N/A
duration=N/A
bit_rate=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
[/STREAM]

在那里你可以看到:

start_time=N/A
duration_ts=N/A
duration=N/A

我尝试了对 AVCodecContext 的无数更改以及对 av_opt_set 函数的大量参数选项。仍然没有运气获得有效的 H.264 视频。我什至尝试过不同版本的 FFmpeg。运气不好。

我正在使用来自 Zeranoe 和 MinGw 4.7.2 的“FFmpeg git-0fb64da 32 位 Dev”构建

最佳答案

您的问题可能不是编码本身,而是您输出原始 H.264 流(我想您使用的是 AnnexB 格式)而没有任何混合。大多数播放器都希望在某些容器(如 MKV、MP4 或 FLV)中播放 H.264,并且不支持播放原始 H.264 流。对于使用 DirectShow 过滤器(如 MPC-HC/WMP)的播放器,它还需要在解码器之前使用原始 H.264 AnnexB 解复用器。尝试使用 MKVToolnix 将此输出复用到 MKV 并测试生成的文件。

关于c++ - 如何使用 FFmpeg C API 对 H.264 视频进行编码,然后使用媒体播放器打开输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408665/

相关文章:

c++ - C++ 中的 Java hashmap.get()

c++ - 如何在可视代码中生成调试器以进行c++开发?

php - ffmpeg 输出 + 问题

video - 如何连接具有不同属性的ffmpeg中的视频?

c - 在机器代码中查找位置 (gcc/objdump -d)

javascript - 如何让 FFMPEG 进行多次录制?

c++ - 了解 OpenCL 在 OpenCV 中的用法(Mat/Umat 对象)

c# - C/C++ 等同于 C# 参数

c - setvbuf 的内存副作用

c - 确定使用 fork 运行的进程数量