ios 录像 转换MP4问题 Invalid output file type

iOS视频导出格式设置
本文介绍了一个iOS应用中如何更改视频的导出格式。通过调整exportSession的outputFileType属性,可以将输出类型从AVFileTypeMPEG4更改为AVFileTypeQuickTimeMovie。文章还展示了如何获取并打印支持的文件类型。

使用的例子是  http://code4app.com/ios/iOSMp4Camera/50cb35ef6803fafc1c000000

 

输出类型是AVFileTypeMPEG4

exportSession.outputFileType = 
        exportSession.outputFileType = AVFileTypeMPEG4;;

 

打印只有com.apple.quicktime-movie

NSArray *supportedTypeArray=exportSession.supportedFileTypes;

        for (NSString *str in supportedTypeArray)

            NSLog(@"%@",str);

修改输出类型

        exportSession.outputFileType = AVFileTypeQuickTimeMovie;

 

即可

该代码什么情况会进去catch try { if (fileAllInfo_.erase.empty()) { throw std::invalid_argument("erase para empty."); } printf("func[%s][%d]:fileAllInfo_.erase.size()=%lu \n", __FUNCTION__, __LINE__, fileAllInfo_.erase.size()); _parseFilePath(filePath_, destFolder); std::ofstream outputFile(destFolder + ".pcf", std::ios::out | std::ios::trunc); if (!outputFile.is_open()) { outputFile.close(); throw std::runtime_error("outputFile failed to open."); } /* write pcf file header */ _writePcfField(outputFile, PCF_FLAG); ///< PCF标记 U32 pcf_header_len += PCF_FIELD_LEN; _writePcfField(outputFile, PCF_VERSION); ///< PCF版本 U32 pcf_header_len += PCF_FIELD_LEN; _writePcfField(outputFile, 0); ///< block数目 U32,初始为0读完重写 pcf_header_len += PCF_FIELD_LEN; _writePcfField(outputFile, 0); ///< alldata CRC U32,初始为0读完重写 pcf_header_len += PCF_FIELD_LEN; /* write pcf 自定义数据 */ std::uint32_t data_format = std::stoul(getFileAttribute().data_format_identifier, nullptr, 16); _writePcfField(outputFile, data_format); ///< 数据格式:是否压缩 U32 pcf_header_len += PCF_FIELD_LEN; printf("func[%s][%d]:data_format=0x%x \n", __FUNCTION__, __LINE__, data_format); //逻辑段信息 std::uint32_t erase_addr = 0; std::uint32_t erase_len = 0; _writePcfField(outputFile, fileAllInfo_.erase.size()); pcf_header_len += PCF_FIELD_LEN; for (auto&amp; item : fileAllInfo_.erase) { erase_addr = std::stoul(item.start_address, nullptr, 16); erase_len = std::stoul(item.length, nullptr, 16); printf("func[%s][%d]:erase_addr=%#x, erase_len=%#x \n", __FUNCTION__, __LINE__, erase_addr, erase_len); _writePcfField(outputFile, erase_addr); ///< 逻辑段擦除地址 U32 pcf_header_len += PCF_FIELD_LEN; _writePcfField(outputFile, erase_len); ///< 逻辑段擦除长度 U32 pcf_header_len += PCF_FIELD_LEN; erase_addr = 0; erase_len = 0; } /* write pcf 自定义数据 填充数据 */ std::uint32_t paddingLen = PCF_HEADER_SIZE - pcf_header_len; std::uint8_t* pPaddingData = new std::uint8_t[paddingLen](); outputFile.write(reinterpret_cast<char*>(pPaddingData), paddingLen); delete[] pPaddingData; std::ifstream inputFile(filePath_, std::ios::in | std::ios::binary); if (!inputFile.is_open()) { inputFile.close(); outputFile.close(); throw std::runtime_error("inputFile failed to open."); } /* 获取cbf数据总长度 */ uint64_t total_data_size = fileStructureInfo_.at(FILE_DATA_LENGTH); printf("func[%s][%d]:total_data_size=0x%lx \n", __FUNCTION__, __LINE__, total_data_size); if (0 == total_data_size) { printf("func[%s][%d]:total_data_size=0x%lx \n", __FUNCTION__, __LINE__, total_data_size); inputFile.close(); outputFile.close(); throw std::runtime_error("error:total_data_size is 0"); } /* 定位到cbf数据位置 */ uint64_t positionToRead = fileStructureInfo_[FILE_DATA_POSITION]; printf("func[%s][%d]:positionToRead=0x%lx \n", __FUNCTION__, __LINE__, positionToRead); inputFile.seekg(positionToRead, std::ios::beg); std::uint8_t block_addr_buf[PCF_FIELD_LEN] = {0}; std::uint8_t block_len_buf[PCF_FIELD_LEN] = {0}; std::uint8_t block_crc_buf[PCF_FIELD_LEN] = {0}; std::uint32_t block_addr = 0; std::uint32_t block_len = 0; unsigned short block_crc = 0xFFFF; std::uint32_t block_num = 0; unsigned short all_data_crc = 0xFFFF; ///< crc_ccitt初始值 std::uint32_t read_bufsize = 0;//每次需要读取大小 std::uint32_t has_read_size = 0;//每个block已经读取大小 std::uint32_t pcf_offset = 0;//记录pcf文件偏移 std::uint32_t cbf_block_crc = 0; //cbf配置字节,vdi存4字节 while (true) { inputFile.read(reinterpret_cast<char*>(block_addr_buf), PCF_FIELD_LEN); if (inputFile.eof()) { break; } block_addr = _convert_arr_to_u32(block_addr_buf); printf("func[%s][%d]:block_addr=%#x \n", __FUNCTION__, __LINE__, block_addr); inputFile.read(reinterpret_cast<char*>(block_len_buf), PCF_FIELD_LEN); if (inputFile.eof()) { break; } block_len = _convert_arr_to_u32(block_len_buf); printf("func[%s][%d]:block_len=%#x \n", __FUNCTION__, __LINE__, block_len); _writePcfField(outputFile, block_addr); pcf_offset += PCF_FIELD_LEN; _writePcfField(outputFile, block_len); pcf_offset += PCF_FIELD_LEN; //如果block大小超过文件大小为异常 if (block_len > total_data_size) { bRet = false; break; } _writePcfField(outputFile, 0); //先默认block crc为0 pcf_offset += PCF_FIELD_LEN; //按设置大小循环读取block read_bufsize = block_len < HEAP_MEMORY_MAX_BUFF ? block_len : HEAP_MEMORY_MAX_BUFF; printf("func[%s][%d]:read_bufsize=%#x \n", __FUNCTION__, __LINE__, read_bufsize); readBuff = new char[read_bufsize](); while (has_read_size < block_len) { std::uint32_t onceSize = (block_len - has_read_size) < read_bufsize ? (block_len - has_read_size) : read_bufsize; inputFile.read(readBuff, onceSize); if (inputFile.eof()) { delete[] readBuff; break; } outputFile.write(readBuff, onceSize); pcf_offset += onceSize; has_read_size += onceSize; //block_crc = CalcCRC(block_crc, onceSize, (unsigned char*)readBuff); printf("func[%s][%d]:block_crc=%#x \n", __FUNCTION__, __LINE__, block_crc); //all_data_crc = CalcCRC(all_data_crc, onceSize, (unsigned char*)readBuff); printf("func[%s][%d]:all_data_crc=%#x \n", __FUNCTION__, __LINE__, all_data_crc); tools_time_delay(10); } inputFile.read(reinterpret_cast<char*>(block_crc_buf), CRC_16_LEN); if (inputFile.eof()) { delete[] readBuff; break; } cbf_block_crc = _convert_arr_to_u32(block_crc_buf); printf("func[%s][%d]:cfg cbf_block_crc=%#x \n", __FUNCTION__, __LINE__, cbf_block_crc); outputFile.seekp(PCF_HEADER_SIZE + pcf_offset - block_len - PCF_FIELD_LEN, std::ios::beg); _writePcfField(outputFile, block_crc); //写完后需要将文件指针移动到末尾,待下一个block输入 outputFile.seekp(0, std::ios::end); if (nullptr != readBuff) { delete[] readBuff; } memset(block_addr_buf, 0, sizeof(block_addr_buf)); block_addr = 0; memset(block_len_buf, 0, sizeof(block_len_buf)); block_len = 0; memset(block_crc_buf, 0, sizeof(block_crc_buf)); block_crc = 0xFFFF; has_read_size = 0; block_num++; } //最后写入block num printf("func[%s][%d]:block_num=%u \n", __FUNCTION__, __LINE__, block_num); outputFile.seekp(PCF_FIELD_LEN + PCF_FIELD_LEN, std::ios::beg); _writePcfField(outputFile, block_num); //最后写入all_data_crc printf("func[%s][%d]:all_data_crc=%#x \n", __FUNCTION__, __LINE__, all_data_crc); _writePcfField(outputFile, all_data_crc); inputFile.close(); outputFile.close(); } catch (std::exception&amp; e) { std::cout << e.what() << std::endl; if (nullptr != readBuff) { delete[] readBuff; } return false; }
09-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值