qn1539141314

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314  发布于  2019-01-16 19:24:06
采纳率 0%
9个问答
2247

用MP4V2库封装H.264播放出来只有一秒是怎么回事?

 
[code]#include "mp4v2/mp4v2.h"
MP4TrackId video = 0;
MP4FileHandle hMP4File = NULL;

void mp4write(char *_naluData,int size,int width,int height)
{
        int index = -1;

        if(_naluData[0]==0 && _naluData[1]==0 && _naluData[2]==0 && _naluData[3]==1 && _naluData[4]==0x67)
        {
                index = _NALU_Iframe;
                isSyncSample = 1;
        }

        if(_naluData[0]==0 && _naluData[1]==0 && _naluData[2]==0 && _naluData[3]==1 && _naluData[4]==0x61)
        {
                index = _NALU_Pframe;
                isSyncSample = 0;
        }
        switch(index)
        {
                case _NALU_Iframe:
                  video = MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 30, width, height, _naluData[4+1], _naluData[4+2], _naluData[4+3],3);
                  if (video == MP4_INVALID_TRACK_ID)
                  {
                      printf("add video track fialed.\n");
                      return;
                  }
                  MP4SetVideoProfileLevel(hMP4File, 0X7F);
                  MP4AddH264SequenceParameterSet(hMP4File, video, _naluData+4, 15);//sps
                  MP4AddH264PictureParameterSet(hMP4File, video, _naluData+23, 4);//pps
                  _naluData[36] = (size- 36 - 4) >> 24;
                  _naluData[37] = (size- 36 - 4) >> 16;
                  _naluData[38] = (size- 36 - 4) >> 8;
                  _naluData[39] = (size- 36 - 4) & 0XFF;
                  MP4WriteSample(hMP4File, video, _naluData+36, size-36, MP4_INVALID_DURATION, 0, isSyncSample);
                  break;
                case _NALU_Pframe:
                  _naluData[0] = (size - 4) >> 24;
                  _naluData[1] = (size - 4) >> 16;
                  _naluData[2] = (size - 4) >> 8;
                  _naluData[3] = (size - 4) & 0Xff;
                  MP4WriteSample(hMP4File, video, _naluData, size, MP4_INVALID_DURATION, 0, isSyncSample);
                  break;
        }
}

void mp4init()
{
    if(hMP4File == NULL)
    {
        hMP4File = MP4CreateEx("./test.mp4",0, 1, 1, 0, 0, 0, 0);
        if (hMP4File == MP4_INVALID_FILE_HANDLE)
        {
                printf("open file fialed.\n");
                return ;
        }
        MP4SetTimeScale(hMP4File, 90000);
    }
}

void mp4close()
{
        MP4Close(hMP4File,0);
        hMP4File = NULL;
        video = 0;
}
[/code]

Iframe是包含了SPS(4+15字节)、PPS(4+4字节)、SEI(4+5字节)、I帧的数据。。最后录出来的视频数据显示确实有那么大(单独存H264数据正常播放,MP4文件与H264差不多大),但是只能播一秒。
请问是哪里设置不对吗
我来回答
回答2个
时间排序
认可量排序

qn1539141314

1个粉丝

9

问答

0

专栏

0

资料

qn1539141314 2019-01-16 20:00:52
认可0
解决了,多次创建track,
调用一次video = MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 30, width, height, _naluData[4+1], _naluData[4+2], _naluData[4+3],3);
                  if (video == MP4_INVALID_TRACK_ID)
                  {
                      printf("add video track fialed.\n");
                      return;
                  }
                  MP4SetVideoProfileLevel(hMP4File, 0X7F);
                  MP4AddH264SequenceParameterSet(hMP4File, video, _naluData+4, 15);//sps
                  MP4AddH264PictureParameterSet(hMP4File, video, _naluData+23, 4);//pps


就行了

willzhang121

0个粉丝

8

问答

0

专栏

0

资料

willzhang121 2019-11-30 16:02:22
认可0
大神,请问一下,你是把MP4文件转成H264码流吗?能否指点一下怎么转的么?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区