How to encode H.264 video using the FFmpeg C API, and then open the output using a media player?

I am trying to encode H.264 video using the FFMPEG C API. I have successfully compiled and executed the decoding / encoding example provided by FFMPEG.

The problem I am facing is that the .mpg file (encoded with AV_CODEC_ID_MPEG1VIDEO) example creates work. Windows creates thumbnails and all that. On the other hand, the .h264 file (encoded with AV_CODEC_ID_H264) does not work. When I try to play a file in VLC, the play / pause button just flickers, there are no thumbnails in the windows, nothing.

During encoding, libx264 reports the following:

[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" returns

 [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] 

Here you can see:

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

I tried countless changes to AVCodecContext and a lot of parameters for the av_opt_set function. Still could not get the H.264 video. I even tried different FFmpeg builds. Bad luck.

I am using "FFmpeg git -0fb64da 32-bit Dev" from Zeranoe and MinGw 4.7.2

+4
source share
2 answers

Your problem is probably not in the encoding itself, but in the fact that you expose the raw H.264 stream (I suppose you used the application format B) without multiplexing. Most players expect H.264 in some containers (e.g. MKV, MP4, or FLV) and do not support the playback of raw H.264 streams. For players using DirectShow filters (for example, MPC-HC / WMP), a raw H.264 AnnexB decoder is also required in front of the decoder. Try to draw this output in MKV using MKVToolnix and test the resulting file.

+3
source

Like nobody555 mentioned , maybe your VLC just won't be able to open this file, because it's a raw stream.

Alternatives are listed at: https://superuser.com/questions/261774/converting-or-playing-a-264-video-file

ffplay is an option, but it also works on VLC 2.2.1, Ubnuntu 15.10.

Also consider an example: https://github.com/FFmpeg/FFmpeg/blob/n3.0/doc/examples/muxing.c , which generates a container format instead of a raw stream.

0
source

Source: https://habr.com/ru/post/1479447/


All Articles