238
- 收藏
- 点赞
- 分享
- 举报
3559板子使用HI_MPI_VENC_GetStream 保存至文件,却无法播放
```cpp
void Hi3559VideoPipeline::vencStreamThread()
{
LOG_INFO(“VENC”, “begin to push stream”);
VENC_STREAM_S stStream{}; // 编码输出
VENC_CHN_STATUS_S stStat{}; // 编码状态
const HI_S32 TIMEOUT_MS = 200; // GetStream 超时
VENC_RECV_PIC_PARAM_S stRecvParam{};
stRecvParam.s32RecvPicNum = -1;
HI_S32 ret = HI_MPI_VENC_StartRecvFrame(cfg_.venc_chn, &stRecvParam);
if (ret != HI_SUCCESS) {
LOG_ERROR("VENC", "StartRecvFrame fail=0x" << std::hex << ret);
}
ret = HI_MPI_VENC_RequestIDR(cfg_.venc_chn, HI_TRUE);
if (ret != HI_SUCCESS) {
LOG_ERROR("VENC", "RequestIDR fail=0x" << std::hex << ret);
}
FILE *fp = fopen("out.h264", "wb");
if (!fp) {
LOG_ERROR("VENC", "open out.h264 failed");
}
bool have_seen_idr = false;
while (streaming_started.load(std::memory_order_relaxed)) {
ret = HI_MPI_VENC_QueryStatus(cfg_.venc_chn, &stStat);
if (ret != HI_SUCCESS) {
LOG_ERROR("VENC", "QueryStatus fail=0x" << std::hex << ret);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
// 仅根据 u32CurPacks 判断是否有包可取
if (stStat.u32CurPacks == 0) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
// 分配 pack 数组(容量 = 当前可取包数)
stStream.u32PackCount = stStat.u32CurPacks;
stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStream.u32PackCount);
if (!stStream.pstPack) {
LOG_ERROR("VENC", "malloc pstPack failed, count=" << stStream.u32PackCount);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
ret = HI_MPI_VENC_GetStream(cfg_.venc_chn, &stStream, TIMEOUT_MS);
if (ret != HI_SUCCESS) {
// 超时或暂无数据
free(stStream.pstPack);
stStream.pstPack = nullptr;
if (ret != HI_ERR_VENC_BUSY && ret != HI_ERR_VENC_NOBUF) {
LOG_ERROR("VENC", "GetStream fail=0x" << std::hex << ret);
}
continue;
}
// 仅当见到首个 IDR 后才开始写文件,避免前面缺参考的 P 帧
if (!have_seen_idr) {
for (HI_U32 i = 0; i < stStream.u32PackCount && !have_seen_idr; ++i) {
const VENC_PACK_S &pk = stStream.pstPack[i];
if (pk.u32Len <= pk.u32Offset) continue;
const uint8_t* p = pk.pu8Addr + pk.u32Offset;
size_t n = (size_t)(pk.u32Len - pk.u32Offset);
// 简易 NAL 扫描:找 00 00 01 / 00 00 00 01 + nal_unit_type==5
for (size_t j = 0; j + 4 < n; ++j) {
bool sc3 = (p[j]==0 && p[j+1]==0 && p[j+2]==1);
bool sc4 = (j+3<n && p[j]==0 && p[j+1]==0 && p[j+2]==0 && p[j+3]==1);
if (!sc3 && !sc4) continue;
size_t k = sc3 ? (j+3) : (j+4);
if (k < n) {
uint8_t nal = p[k] & 0x1F;
if (nal == 5) { have_seen_idr = true; break; }
}
}
}
}
if (have_seen_idr && fp) {
dump_stream_to_file(stStream, fp);
}
// 这里做你的 RTSP 发送/网络推流(务必在 ReleaseStream 前消费完 stStream 数据)
ret = HI_MPI_VENC_ReleaseStream(cfg_.venc_chn, &stStream);
if (ret != HI_SUCCESS) {
LOG_ERROR("VENC", "ReleaseStream fail=0x" << std::hex << ret);
}
free(stStream.pstPack);
stStream.pstPack = nullptr;
stStream.u32PackCount = 0;
}
if (fp) fclose(fp);
LOG_INFO("VENC", "stream thread quit");
}
```有没有大佬知道为什么没办法播放呀?
我来回答
回答3个
时间排序
认可量排序
认可1
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
2016-06-21 13:37:37
-
2017-06-20 23:41:05
-
2020-04-30 11:55:19
-
2020-08-13 18:50:49
-
2017-02-14 15:34:18
-
2020-06-12 10:34:36
-
2018-11-15 09:02:04
-
2013-08-20 14:53:23
-
2017-10-25 14:44:41
-
2019-03-27 10:45:59
-
2025-09-04 16:26:13
-
2016-09-07 20:21:31
-
2015-01-17 10:13:58
-
2016-11-17 18:43:28
-
2017-08-02 10:13:29
-
2020-05-18 17:56:37
-
2017-07-25 17:10:15
-
2019-07-12 18:29:38
-
2016-11-09 20:43:35
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
10hi35169dv500平台使用http协议推拉流UVC摄像头,帧率问题
-
10hi3516cv610关于YOLO优化和调优问题
-
10hi_mpi_vpss_get_chn_frame err:0xa0078016报错
-
5gk7205v200(hisi3516ev200)如何接入b656?
-
30pipe管道创建失败
-
10atc转换模型失败
-
20拍摄静止画面显示正常,拍摄运动的画面出现马赛克显示
-
100hi3516cv610 通过易百纳官方SDK中编译出的uboot env kernel,移植到自己的工程中,MPP初始化时出现内核拷贝数据到用户端时出现错误导致内核进入pain模式进而时内核重启
-
5hisi3519 gs2972 bt1120 转sdi 无法正常显示问题
-
5hisi3516cv610 + gc4336p 夜晚很模糊
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认

微信扫码分享
QQ好友