h264手动添加sps和pps到AVCodecContext-extradata

2024-05-04 03:18

本文主要是介绍h264手动添加sps和pps到AVCodecContext-extradata,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近编码的时候发现生成的视频不能用Windows Media Player等系统自带的播放器播放,也没有缩略图。找了很久,最后才发现在avcodec_open2之前添加一行代码就行了:

codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

调用该行代码后,FFmpeg会在调用avcodec_open2里,在写header时填充sps,pps等信息。不填充编码出来的视频就不能正常解码,当然使用专业的播放器(potplayer等)还是可以。

在没发现添加这行代码就可以之前,我是直接尝试手动添加sps/pps到extradata的。

在avcodec_open2之前添加如下代码,生成的视屏就能用系统自带播放器播放,也有了缩略图。但是Windows资源管理器看的帧高度和宽度不正确,所以还要修改sps_pps数组。

 

unsigned char sps_pps[23] = { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x0a, 0xf8, 0x0f, 0x00, 0x44, 0xbe, 0x8,0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x38, 0x80 }; codec_ctx->extradata_size = 23;codec_ctx->extradata = (uint8_t*)av_malloc(23 + AV_INPUT_BUFFER_PADDING_SIZE);if (codec_ctx->extradata == NULL) {printf("could not av_malloc the video params extradata!\n");return -1;}memcpy(codec_ctx->extradata, sps_pps, 23);


sps和pps的结构参考:h264编码 里面的Sequence parameter set RBSP syntax

 

0x00000001或者0x000001是起始码,0x67是sps的开头,0x68是pps的开头。

0x42代表profile_idc,后面八位是constraint_set0_flag和reserved_zero_4bits,都设为0,0x0a是level_idc,接着后面为图方便能用0表示的都用了。这里要注意是ue(v)表示该域是可变位,使用的指数-哥伦布编码 我的目的主要是设置正确帧高度和帧高度,所以只要填充   pic_width_in_mbs_minus1和  pic_height_in_map_units_minus1,将它们的十六进制数写入sps_pps,如果宽度和高度不是16的倍数,可能要填frame_cropping_flag,具体的做法参考大神博客和SO,我就不误导了。

这篇关于h264手动添加sps和pps到AVCodecContext-extradata的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958236

相关文章

ASP.NET手动触发页面验证控件事件

开发环境:.NET Framework 3.5.1 sp1 参考文章: http://www.codeproject.com/KB/aspnet/JavascriptValidation.aspx http://msdn.microsoft.com/zh-cn/library/aa479045.aspx http://www.cnblogs.com/minsentinel/archive/

【VSCode v1.93.0】手动配置远程remote-ssh

开发环境 VS Code版本:1.93.0 (Windows) Ubuntu版本:20.04 使用VS Code 插件remote-ssh远程访问Ubuntu服务器中的代码,若Ubuntu无法联网,在连接的时候会报错: Could not establish connection to "xxxx": Failed to download VS Code Server(Failed to

【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程

我想观察UE4是怎么编译的,于是查阅官方文档,了解到UE4有一套自己的编译工具:UnrealBuildTool,简称UBT。关于UBT的官方文档参阅:虚幻编译工具。我想尝试自己手动建立一个使用UBT进行编译的空白工程。不过首先,先了解下UBT的编译流程中一些文件所扮演的角色 UBT的编译流程中一些文件所扮演的角色 模块 每个模块都由一个 .build.cs 文件声明,它存储在 Source

Sublime客户端如何手动安装REPL插件

直接通过PackagesControl下进行安装常常会因为各种原因失败,好在有手动安装的方法. 离线安装方法:可以在GitHub上下载 wuub/SublimeREPL​github.com 点击右栏的DOWNLOAD ZIP 下载到电脑,然后解压到安装目录下的Data\Packages下,就可以了。 在线安装:在sublimetext里面下载及安装包。点Preference下的Packa

手动依赖注入;AutowireCapableBeanFactory简述

概述 spring boot虽然帮我们把bean的依赖注入基本都默认配置好了;但有些时候,业务场景中一些对象实例不在spring生命周期中,但是对象中的属性又需要被spring依赖注入(属性在spring容器管理中); 比如一些servle的filter类,其中的一些属性又需要依赖一些spring的bean 我遇到的情况是这样的,实现FactoryBean接口获取到的自定义bean因为没有参

手动开发第一个Web项目

开发Servlet程序的步骤如下 1 . 编写java源文件,文件中的类必须实现Servlet接口或继承HttpServlet类 2 . 编译java源文件,生成class文件 3 . 打包,将编译后的文件按照规定目录结构进行整理 4 . 部署,将目录结构复制到Web容器的指定位置 5 . 启动Web容器,输入符合规范的地址访问Servlet 不管是在

hibernate手动分配assigned 主键增长方式

一、手动分配数据库主键增长方式 assigned 二、还是hibernate_basemapping项目 1、新建 User.class 类 package com.bjsxt.hibernate;   import java.util.Date;   public class User3 {    private String id;//实体是有标识的,我们最好建立一个唯一性的

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码(压缩)视频数据?✨如何编码(压缩)数据🎄简单的例子🎄音视频编码方式🎄视频编码格式H264编码是什么?发展历程?H.264基本单元H.264的I帧,P帧,B帧 🎄音频编码格式 ✨视频文件封装格式✨解封装格式✨视频解码✨H264分层结构🎄网络上传输H264视频数据的流程VCL的结构关系 🎄NAL单元 ✨ 参考文章 ✨播放一个视频的流

【Android 多媒体应用】使用MediaCodec将摄像头采集的视频编码为h264

转载自:http://www.cnblogs.com/CoderTian/p/6224605.html MainActivity.java import android.app.Activity;import android.graphics.ImageFormat;import android.hardware.Camera;import android.hardware.Camera

WordPress 手动还原到旧版本与新版

WordPress 手动还原到旧版本与新版 WordPress后台一般都可以直接一键升级,但是也存在一些情况导致无法自动升级,比如说权限不足,还有就是一些文件的权限不一样,当然我们可以设置0777权限,但是不够安全。简单说一下 wordpress 手动还原到旧版本 和 WordPress 手动更新到最新版的方法,其实,操作都是一样的,可以说是手动更新到任意版本。