在线等:MTK中mp3帧的播放问题

BuleRiver 2009-12-23 02:27:34
大家好,在MTK平台下,如何播放mp3帧呢?假如我有一帧mp3数据(该数据可能是从文件中读取的,也可能是从网络下载的),如何播放它呢?应该调用哪个播放接口呢?谢谢大家。
另外,我做了一个小程序,在goto_main_menu()函数中,调用我自己的函数:

void goto_main_menu(void)
{
// ...
audio_play_entry();
return;// 直接返回,因为我不想让它做其他的了
// ...
}


然后我自己的函数:

void audio_play_entry(void)
{
EntryNewScreen(MAIN_MENU_SCREENID, NULL, audio_play_entry, NULL);
clear_screen();
gui_move_text_cursor(50, 100);
gui_set_text_color(UI_COLOR_RED);
gui_print_text(L"Audio Player");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);

SetKeyHandler(play_mp3_file, KEY_LSK, KEY_EVENT_UP); // 左软键,播放mp3
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);// 右软键
}


真正的播放函数:

void play_mp3_file(void)
{
mdi_result result;
mdi_audio_set_volume(VOL_TYPE_MEDIA, MDI_AUD_VOL_EX(10));
result = mdi_audio_play_file_with_vol_path(
"D:\\audio\\a.mp3",
DEVICE_AUDIO_PLAY_ONCE,
NULL,
EndPlayProc,
10,
MDI_AUD_PTH_EX(MDI_DEVICE_SPEAKER2));
if (MDI_AUDIO_SUCCESS == result)
{
StartTimer(AUDPLY_SINGLE_PLAY_TIMER, 500, OnTimer);
}
else
{
DisplayPopup((U8*)L"mdi faild!", IMG_GLOBAL_OK, 1, 5000, 13);
}
}


回调和定时器:

void EndPlayProc(mdi_result result)
{
StopTimer(AUDPLY_SINGLE_PLAY_TIMER);
}

void OnTimer(void)
{
StartTimer(AUDPLY_SINGLE_PLAY_TIMER, 500, OnTimer);
}

结果一运行该函数,直接就弹出对话框,提示“mdi faild!”,请各位大虾们指点。
这是播放文件的,那么播放mp3帧的,是哪个函数呢?谢谢大家了。
...全文
438 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mon185 2011-08-02
  • 打赏
  • 举报
回复
楼主 你的MP3播放问题怎么解决的,我也遇到了类似的问题。谢谢
dahan_wangtao 2010-12-26
  • 打赏
  • 举报
回复
result = mdi_audio_play_file_with_vol_path(
"D:\\audio\\a.mp3",
DEVICE_AUDIO_PLAY_ONCE,
NULL,
EndPlayProc,
10,
MDI_AUD_PTH_EX(MDI_DEVICE_SPEAKER2));
应该是 L"D:\\audio\\a.mp3"
dahan_wangtao 2010-12-26
  • 打赏
  • 举报
回复
MDI_FORMAT_DAF MP3的
sheencxf 2010-07-13
  • 打赏
  • 举报
回复
我想问以下LZ,你那个MP3的问题是怎么解决的,可否说一下,在线等待...
BuleRiver 2009-12-24
  • 打赏
  • 举报
回复
在文件Audio_Converter.cpp中看到这么一行:

#define FORMAT_MP3 "5" /* sync with med_main.h */

对比上面所有的文件格式,发现和MDI_FORMAT_DAF是一样的。
很迷惑,mp3和daf两种格式有什么渊源吗?
BuleRiver 2009-12-24
  • 打赏
  • 举报
回复
还有就是,mdi_audio_play_string_with_vol_path()接口可以播放PCM数据,但是我在MTK定义的格式中没有发现mp3格式,如何才能播放mp3帧呢?还是原来的问题,假如我现在有一帧mp3数据,使用哪个接口播放呢?能不能不经过解码,直接播放呢?另附上MTK的格式:

enum
{
MDI_FORMAT_NONE = -1,
MDI_FORMAT_GSM_FR, /* 0 */
MDI_FORMAT_GSM_HR, /* 1 */
MDI_FORMAT_GSM_EFR, /* 2 */
MDI_FORMAT_AMR, /* 3 */
MDI_FORMAT_AMR_WB, /* 4 */
MDI_FORMAT_DAF, /* 5 */
MDI_FORMAT_AAC, /* 6 */
MDI_FORMAT_PCM_8K, /* 7 */
MDI_FORMAT_PCM_16K, /* 8 */
MDI_FORMAT_G711_ALAW, /* 9 */
MDI_FORMAT_G711_ULAW, /* 10 */
MDI_FORMAT_DVI_ADPCM, /* 11 */
MDI_FORMAT_VR, /* 12 */
MDI_FORMAT_WAV, /* 13 */
MDI_FORMAT_WAV_ALAW, /* 14 */
MDI_FORMAT_WAV_ULAW, /* 15 */
MDI_FORMAT_WAV_DVI_ADPCM, /* 16 */
MDI_FORMAT_SMF, /* 17 */
MDI_FORMAT_IMELODY, /* 18 */
MDI_FORMAT_SMF_SND, /* 19 */
MDI_FORMAT_MMF, /* 20 */
MDI_FORMAT_AU, /* 21 */
MDI_FORMAT_AIFF, /* 22 */
MDI_FORMAT_VRSI, /* 23 */
MDI_FORMAT_WMA, /* 24 */
MDI_FORMAT_M4A, /* 25 */
MDI_FORMAT_3GP, /* 26 */
MDI_FORMAT_MP4, /* 27 */
MDI_FORMAT_JPG, /* 28 */
MDI_FORMAT_GIF, /* 29 */
MDI_FORMAT_MJPG, /* 30 */
MDI_FORMAT_PNG, /* 31 */
MDI_NO_OF_FORMAT
};

我在这里面看来看去,也不清楚哪个是mp3,或者根本没有?请大家指点,谢谢!!!
BuleRiver 2009-12-24
  • 打赏
  • 举报
回复
多谢大家,终于可以播放mp3文件了。
另外,我在使用接口mdi_audio_play_string_with_vol_path()播放PCM数据(采样率为8K)的时候(我的pcm文件大小是64K),发现如果我一次把数据都读入到缓冲区中,然后播放,那么播放的很好:

FS_HANDLE g_file_handle;
U8 audio_data[1024 * 64];
UINT len;
#define buf_size sizeof(audio_data)
void play_pcm_frame(void)
{
if ((g_file_handle = FS_Open(L"D:\\text\\good.pcm", FS_READ_ONLY)) < 0)
{
DisplayPopup((U8*)L"Open File Failed", IMG_GLOBAL_OK, 1, 5000, 13);
return;
}

while (1)
{
if (FS_NO_ERROR != FS_Read(g_file_handle, audio_data, buf_size, &len))
{
DisplayPopup((U8*)L"Read File Failed", IMG_GLOBAL_OK, 1, 5000, 13);
FS_Close(g_file_handle);
return;
}

mdi_audio_play_string_with_vol_path(audio_data, buf_size, MDI_FORMAT_PCM_8K, DEVICE_AUDIO_PLAY_ONCE, NULL, NULL, (U8)6, MDI_DEVICE_SPEAKER_BOTH);
if (len < buf_size)
{
break;
}
}
FS_Close(g_file_handle);
}

但是,如果我把缓冲区改成1K:

U8 audio_data[1024];

那么就播放的时候几乎1秒才响一下,根本不能正常播放,这是为什么呢?
chenzhp 2009-12-23
  • 打赏
  • 举报
回复
mdi_audio_play_file_portion_with_vol_path
chenzhp 2009-12-23
  • 打赏
  • 举报
回复
如果你不需要在播放完毕后针对result做出处理,就不用定义那个回调函数。

我曾经在一个项目中用了这个函数来播放音频片段。就是播放一个单词,当时是可以的。


void Bdc_PlayAudio(void)
{
S32 result = 0;
if(!set_d.volumnswitch)
{

}
else
{
result = mdi_audio_play_file_portion_with_vol_path((void *)pMP3FileName, cwInfo2->m_courseData.m_cRW.m_cNode[g_WordIndex].m_lTime*10,
cwInfo2->m_courseData.m_cRW.m_cNode[g_WordIndex].m_lTime*10 + cwInfo2->m_courseData.m_cRW.m_cNode[g_WordIndex].m_lTimeLast, DEVICE_AUDIO_PLAY_ONCE, &h_handle, mmi_play_callback_hdlr, (U8)(set_d.volumnadjust), /*MDI_DEVICE_SPEAKER_BOTH*/MDI_DEVICE_SPEAKER2);


}

}
chenzhp 2009-12-23
  • 打赏
  • 举报
回复
晚上回家看看呢。。。
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
另外,问一下:函数mdi_audio_play_file_with_vol_path()中的倒数第三个参数是一个函数指针类型:mdi_callback handler,如果我没有理解错,是不是播放完文件后,调用这个文件?还有在我的代码里,仿照系统播放器的样子,我是开了一个定时器,但是在系统播放器中,该定时,仅仅是界面的操作,所以,对于播放文件,有没有必要开启这个定时器?
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lius1984 的回复:]
可以试试 Mdi_audio.c里的 mdi_audio_play_file_portion_with_vol_path来播放音频
[/Quote]
是直接调用这个函数,来播放音频吗?还需要调用其他的函数来进行类似于“初始化”之类的工作吗?
lius1984 2009-12-23
  • 打赏
  • 举报
回复
可以试试 Mdi_audio.c里的 mdi_audio_play_file_portion_with_vol_path来播放音频
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
多谢回复!!!
我关机后,然后用数据线连上电脑,确实显示有出两个盘符,谢谢!
看到一个函数:mdi_audio_init(),莫非在调用mdi层的播放接口的时候,要调用这个函数?
chenzhp 2009-12-23
  • 打赏
  • 举报
回复
在模拟器上应该是无法播放的。
在真机上,你要保证你的MP3文件的存放位置。你确定你真机上有D盘么
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
在模拟器上好像有问题,无论是什么,好像都播放不出来
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
是在真机上做的
chenzhp 2009-12-23
  • 打赏
  • 举报
回复
楼主是不是在模拟器上操作的呀?
BuleRiver 2009-12-23
  • 打赏
  • 举报
回复
另外,在目录:d:\\audio\\下,我也确实放了a.mp3,所以不存在没有找到文件的问题,请大家指点,谢谢!!!
频GSM6.10,位速5150的AVI视频格式在网上一直很难找到,但一些韩机仿机和一些国产手机却使用这种视频格式,如仿w800,仿7610等,下面我们将详细介绍这种视频格式的转换方法!

需要用到三个转换工具
1.AVIGenerator
2.Nokia Multimedia Converter 2.0
3.VirtualDub

AVIGenerator 简介
MTK 的视频播放器只支持特定格式的AVI 文件。MTK 的客户可能想在他们的网站提
供下载AVI 文件。为了保证这些AVI 文件可以在MTK 的视频播放播放,我们推荐用
AVIGenerator 来生成这些文件。



AVIGenerator 的用户接口如上图
1.装载包含了源JPEG 和AMR 文件的文件夹。(必须为英文路径)
2.显示区:显示已经选择的路径。
3.显示区:显示在选择的文件夹里是否有名为“audio.amr”的文件。如果有一个名为
“audio.amr”的文件该显示区域就会显示“Audio:yes”,否则就会显示“Audio:None”。
声音文件必须被命名为“audio.amr”并且必须和源JPEG 文件放在相同的一个目录。
注意:AMR 文件的大小不能超过100KB。
4.显示区。显示所选择的JPEG 文件的范围。每一个JPEG 文件名必须由数字和以“JPG”
或“JPEG”为扩展名组成。
注意:每一个JPEG 文件的大小不可以超过20KB。
5.输入区:输入视频文件的视频长宽。
注意:最大宽度320,最大长度:140。
6.输入区。输入每秒的数。
注意:最大数10。

准备阶段
1.准备JPEG 格式的图形。
播放AVI 电影的机制是连续地显示大量的JPEG 图片,例如一秒钟7 张图(7fps)。所以其
的一项准备工作是准备许多的JPEG 图形。你可以用Photoshop 一张张地画,或者用其他
工具从许多格式的电影提取,例如:RMVB,AVI,MPG 和DVD 等。
为了方便,在这个手册,我们用工具来获取图像。有何多软件可以执行这个任务。我
们推荐用“VirtualDub”版本是1.6.8。



通过菜单“视频-〉速”,设置输出速为10fps 或者少一些。


通过菜单“编辑”来设置起点和终点,软件将处理他们之间的
通过菜单“文件-〉保存图像序列”来保存连续的JPEG 图。




2.准备AMR 格式的声音。
首先,我们必须在VirtualDub 保存声音文件。和保存图像一样,通过“文件”菜单保存
WAV 文件


当我们已经从电影文件保存WAV声音文件,接下来就是把它转化成AMR格
式。所以我们需要另外的软件“Nokia Multimedia Converter Pro 2.0”。


打开源WAV文件,设置AMR位率为5.15(为了减小声音文件的大小),如上图
显示。点击按钮“Convert”来转化声音文件另外记得把转化后的文件保存到图
像文件相同的文件夹里。转化成的文件文件名必须为“audio.amr”。
如何让视频和音频同步。
事实上,AVIGenerator的当前版本不能支持这个功能。
当你在VirtualDub保存图像和声音时,请保证他们是来自相同的起点和终
点范围。让第一个时间作为总图像数/数。让第二个时间作为AMR声音的总时
间长度。如果图像和声音来自相同的范围并且第一个时间和第二个时间相等,那
么视频和音频就可以同步。


生成阶段

点击按钮“Load”来选择包含图像和声音的文件夹。AVIGenerator会获取命
名为连续数字的图像文件和“audio.amr”声音文件。
1.JPEG文件的扩展名必须是“JPG”或者“JPEG”。
2.如果有“p0.jpg, 0.jpg, 1.jpg, 2.jpg, 3.jpg, 4.jpg, 005.jpg, p6.jpg”在文件夹
AVIGenerator只会提取“0.jpg, 1.jpg, 2.jpg, 3.jpg, 4.jpg”。
3.如果图像的尺度大于“320*240”,那么设置宽度为320设置高度为240。
4.如果图像的大小大于20KB,那么这张图将不会被加到AVI文件
5.最大的速是10fps。
6.声音文件必须被命名为“audio.amr”。
点击按钮“Generator”来生成AVI文件。

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧