gpt4 book ai didi

c++ - 使用 ffmpeg 创建一个 44 字节的 header

转载 作者:行者123 更新时间:2023-11-28 06:10:27 27 4
gpt4 key购买 nike

我使用 ffmpeg 库制作了一个程序,可以将音频文件转换为 wav 文件。除了唯一的问题是它不会创建 44 字节的 header 。将文件输入到Kaldi Speech Recognition中时,会产生错误:

ERROR (online2-wav-nnet2-latgen-faster:Read4ByteTag():wave-reader.cc:74) WaveData:需要 4 字节 block 名称,读取错误

我通过 shntool 运行该文件,它报告了一个 78 字节的 header 。无论如何我可以使用 ffmpeg 库获得标准的 44 字节 header 吗?

最佳答案

FFmpeg 将一些关于编码器的元数据插入到头文件中。这是修复前 header 的 hexdump:

00000000 52 49 46 46 06 90 00 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 10 00 00 00 01 00 01 00 40 1f 00 00 80 3e 00 00 |.........@....>..|
00000020 02 00 10 00 4c 49 53 54 1a 00 00 00 49 4e 46 4f |....列表....信息|
00000030 49 53 46 54 0e 00 00 00 4c 61 76 66 35 36 2e 33 |ISFT....Lavf56.3|
00000040 36 2e 31 30 30 00 64 61 74 61 c0 8f 00 00 00 00 |6.100.data......|

如您所见,Lavf56.36.100 是 header 中的编码器。这是我用来摆脱它的代码部分。

std::cout<<"------------------BEFORE-----------------------"<<std::endl;
std::cout<< av_dict_count ( (*ofmt_ctx)->metadata) <<std::endl;
std::cout<<"-------------------------------------------"<<std::endl;
if(av_dict_set(&(*ofmt_ctx)->metadata,"ISFT",NULL, AV_DICT_IGNORE_SUFFIX)){
std::cerr<<"Nope it, didn't work :("<<std::endl;
}

ret = avformat_write_header(*ofmt_ctx,&(*ofmt_ctx)->metadata );
if (ret < 0) {
std::cout<<"-------------------------------------------"<<std::endl;
av_log(NULL, AV_LOG_ERROR, "Error occurred when writing header to file\n");
return ret;
}
std::cout<<"------------------AFTER-----------------------"<<std::endl;
std::cout<< av_dict_count ( (*ofmt_ctx)->metadata) <<std::endl;
std::cout<<"-------------------------------------------"<<std::endl;

这是之后的十六进制转储:
00000000 52 49 46 46 e4 8f 00 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 10 00 00 00 01 00 01 00 40 1f 00 00 80 3e 00 00 |.........@....>..|
00000020 02 00 10 00 64 61 74 61 c0 8f 00 00 00 00 00 00 |....数据.......|
00000030 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 |................|

shntool 现在报告 44 字节

(注意:ofmt_ctx 在我创建的这个函数中是一个 **,因此为什么将元数据字典引用为 &(*ofmt_ctx)->metadata)

关于c++ - 使用 ffmpeg 创建一个 44 字节的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com