ian688t6

ian688t6

0个粉丝

5

问答

0

专栏

0

资料

ian688t6  发布于  2018-07-28 10:11:05
采纳率 0%
5个问答
2734

hi3520d mp4解码回放

 
mp4的解码回放已经调试成功了,记录一下
mp4 video sample是没有h264 nal头的,所以在丢给vdec解码前,我做了写拷贝操作:

1. 判断mp4 video sample是否为关键帧;因为在之前mp4的编码时,video sample的bit0 ~ bit3是这个sample 的长度,bit4为是否为关键帧的标识所以判断psample[4] == 0x65来判断是否关键帧;
2. 替换掉video sample的前4个字节,第一步已经说了前四个字节为长度,要替换成nal分割标示{0x00, 0x00,  0x00, 0x01}
3. 如果video sample 为关键帧要就要加上sps 和 pps的头

下面是相关处理的代码,读取mp4的video sample并处理为h264 的一帧图像

        i_ret = mp4_read_video_sample(pst_ctx->pst_mp4, ui_sampleid, &puc_src, &ui_sample_size, &i_is_sync, &ui_delta);
        if (0 == i_ret)
        {
                loge("failed current video frame num = %d, total frame num=%d", ui_sampleid, pst_ctx->ui_video_sample_total);
                return -1;
        }
        /* copy nal hander */
        memcpy(puc_src, auc_nal, sizeof(auc_nal));
        ui_sample_len = ui_sample_size;
        if (1 == i_is_sync)
        {
                *pui_issync = 1;
                ui_sample_len += pst_ctx->ui_seqheader_size + pst_ctx->ui_picheader_size + 2 * sizeof(auc_nal);
                *ppuc_buf = puc_dst = (uint8_t *)malloc(ui_sample_len * sizeof(uint8_t));
                if (NULL == puc_dst)
                {
                        free(puc_src);
                        loge("read_one_video_frame alloc mem failed!");
                        return -1;
                }

                /* copy nal header */
                memcpy(puc_dst, auc_nal, sizeof(auc_nal));
                puc_dst += sizeof(auc_nal);
                /* copy sps */
                memcpy(puc_dst, pst_ctx->puc_seqheader, pst_ctx->ui_seqheader_size);
                puc_dst += pst_ctx->ui_seqheader_size;
                /* copy nal header */
                memcpy(puc_dst, auc_nal, sizeof(auc_nal));
                puc_dst += sizeof(auc_nal);
                /* copy pps */
                memcpy(puc_dst, pst_ctx->puc_picheader, pst_ctx->ui_picheader_size);
                puc_dst += pst_ctx->ui_picheader_size;
        }
        else
        {
                *ppuc_buf = puc_dst = (uint8_t *)malloc(ui_sample_len);
                if (NULL == puc_dst)
                {
                        free(puc_src);
                        loge("read_one_video_frame alloc mem failed!");
                        return -1;
                }
                *pui_issync = 0;
        }

        memcpy(puc_dst, puc_src, ui_sample_size);
我来回答
回答2个
时间排序
认可量排序

mom

0个粉丝

4

问答

0

专栏

0

资料

mom 2018-08-21 17:12:06
认可0
感谢楼主分享!

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2018-07-30 10:20:08
认可0
:lol:lol:lol:lol:lol:lol:lol:lol
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区