106
- 收藏
- 点赞
- 分享
- 举报
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
-
2020-04-30 11:55:19
-
2017-06-20 23:41:05
-
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
-
2025-09-04 16:26:13
-
2019-03-27 10:45:59
-
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币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5hisi3516cv610 + gc4336p 夜晚很模糊
-
5AIISP(功能演示,SC4336P为BGGR,强制转RGGB,会导致颜色异常)
-
5rv1106使用luckfox的SDK,设备树和驱动都写好了,结果设备文件没有生成
-
5海思3516cv610中如何进行SD卡升级,根据官方文档操作,烧录进板子时,走的默认uboot,没有执行uboot升级。
-
5G610Q-IPC-38E 夜晚很暗 有什么办法解决吗 已经补光了
-
10转换模型时,SoC版本里没显示hi3516cv610芯片
-
5hisi3516cv610 使用 yolov8n 模型训练 要如何提高 这里识别的是人
-
10有人在海思平台接过SC035HGS吗
-
5关于hi3519dv500,以SD卡虚拟 U 盘操作
-
5ss928 sample_venc代码移植到openEuler24.03上执行报错 [sample_comm_vi_start_dev]-1068: vi set dev attr failed wi
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认

微信扫码分享
QQ好友