FFmpeg avformat_open_input 错误返回 -5 的可能原因

关于FFmpeg项目中遇到一些问题

  使用FFmpeg编写录制音频程序时,在avformat_open_input 函数处卡住,该函数一直报错并返回错误码 -5, 百思不得其解,查了很多资料,仍不得解答,后观看 雷神 文章 发现该问题是由于:
  我的音频设备名中含有中文字符:

audio=麦克风 (Realtek® Audio)

  需要从ANSI字符格式转换成UTF-8格式,因为这是FFmpeg支持的字符格式。
  转换代码如下:

	std::string AnsiToUTF8(const char *_ansi, int _ansi_len)
	{
		std::string str_utf8("");
		wchar_t* pUnicode = NULL;
		BYTE * pUtfData = NULL;
		do
		{
			int unicodeNeed = MultiByteToWideChar(CP_ACP, 0, _ansi, _ansi_len, NULL, 0);
			pUnicode = new wchar_t[unicodeNeed + 1];
			memset(pUnicode, 0, (unicodeNeed + 1) * sizeof(wchar_t));
			int unicodeDone = MultiByteToWideChar(CP_ACP, 0, _ansi, _ansi_len, (LPWSTR)pUnicode, unicodeNeed);

			if (unicodeDone != unicodeNeed)
			{
				break;
			}

			int utfNeed = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pUnicode, unicodeDone, (char *)pUtfData, 0, NULL, NULL);
			pUtfData = new BYTE[utfNeed + 1];
			memset(pUtfData, 0, utfNeed + 1);
			int utfDone = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pUnicode, unicodeDone, (char *)pUtfData, utfNeed, NULL, NULL);

			if (utfNeed != utfDone)
			{
				break;
			}
			str_utf8.assign((char *)pUtfData);
		} while (false);

		if (pUnicode)
		{
			delete[] pUnicode;
		}
		if (pUtfData)
		{
			delete[] pUtfData;
		}

		return str_utf8;
	}

  仅仅需要在使用avformat_open_input函数前,将你的含中文的设备名转换成UTF-8格式即可。

如果你照着前面的做法依然没有解决问题,那么再看下面

还有可能的原因:

  • 文本保存的编码不同,导致你保存的中文乱码,执行转换函数后自然也就转换不出你想要的中文字符,这时你可以通过各种文本编辑器将保存该中文字符的文本保存成UTF-8 无BOM型

如果你恰好用到VS那么,你可以使用VS自带的高级保存工具,将代码保存成UTF-8 无BOM型。
方法如下:
点击菜单栏的文件选项:找到高级保存选项这一栏,打开:将编码设置成Unicode - 代码页 1200
如果没有在文件选项中找到高级保存选项这一栏,也不要慌,可能是你的VS没有打开这个选项,我这里比较懒,没有提供打开这个选项的方法,你可以自行百度,然后照做就行。

你可能感兴趣的:(音视频,FFmpeg,C++)