我使用SDP的profile-level-id et sprop-parameter-set设置AvCodecContext的profile_idc,level_idc,extradata和extradata_size.
我将Coded Slice,SPS,PPS和NAL_IDR_SLICE数据包的解码分开:
uint8_t start_sequence [] = {0,0,1}; int size = recv(id_de_la_socket,(char*)rtpReceive,65535,0);
char *z = new char[size-16+sizeof(start_sequence)];
memcpy(z,&start_sequence,sizeof(start_sequence));
memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
delete z;
Run Code Online (Sandbox Code Playgroud)
结果:ConsumedBytes> 0且GotPicture> 0(经常)
相同的代码.结果:ConsumedBytes> 0且GotPicture = 0
我认为这是正常的
当我找到一对新的SPS/PPS时,我使用此数据包的有效负载及其大小更新extradata和extrada_size.
Nal单元类型是28 => idr帧被分段为此我尝试了两种方法来解码
1)我在第一个片段(没有RTP头)前加上序列0x000001,并将其发送到avcodec_decode_video.然后我将剩下的片段发送到这个函数.
2)我将第一个片段(没有RTP头)加上序列0x000001的前缀,并将其余的片段连接到它.我把这个缓冲区发送给解码器.
在这两种情况下,我都没有错误(ConsumedBytes> 0)但我没有检测到任何帧(GotPicture = 0)......
问题是什么 ?
我有一个原始 h264 文件,可以在 Mac 上使用 VLC 显示:
打开-a VLC文件.h264
我可以使用命令行将其转换为 mp4
ffmpeg -f h264 -i file.h264 -c:v copy file.mp4
但我真正想做的是:
猫文件.h264 | ffmpeg > 文件.mp4
原因是输入是通过套接字传输的,我想将其转换并即时发送到 html 文件中的视频标签。
另一种解决方案是在网页中显示原始 h264,而不先将其转换为 mp4。
输入是逐帧输入的,前四个字节是 0,0,0,1。我的理解是这个h264附件B格式。
我对视频格式一无所知,我很高兴能指出一个方向来看看。
我应该像这个问题一样考虑使用 libavcodec 编写代码还是有现成的解决方案?
使用 libavformat 混合到 MP4 的 H.264 无法播放
谢谢!