wmv转换mp4格式转换器_avi可以转化成什么格式

wmv转换mp4格式转换器_avi可以转化成什么格式MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。(一)首先,从原理上了解一下这2种格式的区别:AVC1描述:H.264bitstreamwithoutstartcodes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。H264描述:H.26

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

原文:http://www.mworkbox.com/wp/work/314.html
MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。
(一)首先,从原理上了解一下这2种格式的区别:
AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。
H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。
(二)其次,通过VLC播放器,可以查看到具体的格式。打开视频后,通过菜单【工具】/【编解码信息】可以查看到【编解码器】具体格式,举例如下,编解码器信息:
编码: H264 – MPEG-4 AVC (part 10) (avc1)
编码: H264 – MPEG-4 AVC (part 10) (h264)
(三)最后,分享一下ffmpeg demux MP4文件后,转换视频流为live555可直接使用的h264 ES流的经验和方法:
针对(avc1),av_read_frame后,取前四个字节为长度,把前四字节直接替换为0×00,0×00,0×00,0×01即可,但注意每个frame可以有多个NAUL:

  AVPacket pkt;
    AVPacket* packet = &pkt;
    av_init_packet(packet);
    av_read_frame(ctx, packet);

if(packet->stream_index == 0)
    {//is video stream

       const char start_code[4] = { 0, 0, 0, 1 };
            if(is_avc_ || memcmp(start_code, packet->data, 4) != 0)
            {//is avc1 code, have no start code of H264
                int len = 0;
                uint8_t *p = packet->data;

                is_avc_ = True;
                do 
                {//add start_code for each NAL, one frame may have multi NALs.
                    len = ntohl(*((long*)p));
                    memcpy(p, start_code, 4);

                    p += 4;
                    p += len;
                    if(p >= packet->data + packet->size)
                    {
                        break;
                    }
                } while (1);
            }
        }
//对于另外一种格式,(h264), 则直接对每个packet调用
//av_bitstream_filter_filter处理每个packet即可:

bsfc_ = av_bitstream_filter_init("h264_mp4toannexb");

   if(pkt->stream_index == 0)
   {//is video stream

      AVBitStreamFilterContext* bsfc = bsfc_;
        int a;
        while (bsfc) {
            AVPacket new_pkt = *pkt;
            a = av_bitstream_filter_filter(bsfc, encode_ctx_, NULL,
                &new_pkt.data, &new_pkt.size,
                pkt->data, pkt->size,
                pkt->flags & AV_PKT_FLAG_KEY);
            if(a == 0 && new_pkt.data != pkt->data && new_pkt.destruct) { uint8_t *t = (uint8_t*)(new_pkt.size + FF_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow if(t) { memcpy(t, new_pkt.data, new_pkt.size); memset(t + new_pkt.size, 0, FF_INPUT_BUFFER_PADDING_SIZE); new_pkt.data = t; a = 1; } else
                    a = AVERROR(ENOMEM);
            }
            if (a > 0 && pkt->data != new_pkt.data) { av_free_packet(pkt); new_pkt.destruct = av_destruct_packet; } else if (a < 0) { envir() << "!!!!!!!!!!av_bitstream_filter_filter failed" << ",res=" << a << "\n"; }
            *pkt = new_pkt;

            bsfc = bsfc->next;
        }
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181195.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《深入浅出WPF》——模板学习

    《深入浅出WPF》——模板学习一、前言    图形用户界面(GUI,GraphicUserInterface)应用较之控制台界面(CUI,CommandUserInterface)应用程序最大的好处就是界面友好、数据显示直观。CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本、列表、图形等多种形式立体显示。  用户体验在GUI程序设计中起着举足轻重的作用——用户界面设计成什么样子看上去才够漂亮?控件如何安排才简单易用并且少犯错误?(控件并不是越复杂

    2022年7月19日
    37
  • 解决touchStart滑动时触发点击事件「建议收藏」

    解决touchStart滑动时触发点击事件「建议收藏」由于我们在将点击事件委托到div,span,font,p等元素标签上时会导致移动端的ios设备无法识别这个点击事件(一般指click事件),此时我们一般会使用touchstart来替换click事件,但是使用touchstart来代替click事件的弊端就立刻显示出来,每当我们滑动屏幕时就会立刻出发点击事件此时加入我这个封装的方法,这个弊端就会迎刃而解functiontap(el,fn…

    2022年6月19日
    27
  • Git 分支合并分支代码

    Git 分支合并分支代码git分支合并分支

    2025年6月19日
    3
  • 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)微信公众号主要有以下几个步骤微信公众号的通讯机制微信公众号简介1.注册微信公众号2.注册测试公众号3.搭建微信本地调试环境1)下载客户端natapp:2)安装natapp:4.微信公众号接入(校验签名)第1步中服务器配置包含服务器地址(URL)、令牌(Token)和消息加解密密钥(EncodingAESKey)。第2步,验证服务器地址的有效性,当点击“提交”…

    2022年6月6日
    26
  • 基于keras的双层LSTM网络和双向LSTM网络

    基于keras的双层LSTM网络和双向LSTM网络1前言基于keras的双层LSTM网络和双向LSTM网络中,都会用到LSTM层,主要参数如下:LSTM(units,input_shape,return_sequences=False)units:隐藏层神经元个数 input_shape=(time_step,input_feature):time_step是序列递归的步数,input_feature是输入特征维数 re…

    2022年6月17日
    30
  • clientWidth、offsetWidth等介绍[通俗易懂]

    clientWidth、offsetWidth等介绍[通俗易懂]网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth(包括边线的宽)网页可见区域高:document.body.offsetHeight(包括边线的宽)网页正文全文宽:document.body.scrollWidth网页正文全文高:do…

    2022年7月22日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号