播放音频“yuo.mp3"中从2分13秒到3分06之间的一段录音,vb如何实现。

yanghao1 2018-04-17 08:27:50
播放音频“yuo.mp3"中从2分13秒到3分06之间的一段录音,vb如何实现。
...全文
974 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
引用 6 楼 yanghao1 的回复:
[quote=引用 1 楼 Chen8013 的回复:] 看楼主之前已经发过好几个地方了,似乎都没解决啊………… 给你一段代码参考一下。 打开某Mp3文件、从头到尾全部播放,是没问题的。 我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" ( _
                           ByVal lpstrCommand As Long, _
                           ByVal lpstrReturnString As Long, _
                           ByVal uReturnLength As Long, _
                           ByVal hwndCallback As Long) As Long

Private strFile   As String
Private mlFlag    As Long

Private Sub PlayMp3()
   Dim strOpenCMD As String
   Dim strPlayCMD As String

   mlFlag = vbTrue
   strOpenCMD = "open " & strFile & " Alias MyMp3"
   strPlayCMD = "play MyMp3 from 15000 to 120000"
   ' 从15秒处开始播放到120秒处(命令串中的时间单位是ms)
   ' 不过发现很不靠谱:128Kbps固定码率的那首歌基本正确;另一首256Kbps变比码率的“差之千里”
   Call mciSendString(StrPtr(strOpenCMD), 0&, 0&, 0&)
   Call mciSendString(StrPtr(strPlayCMD), 0&, 0&, 0&)
End Sub

Private Sub StopMp3()
   If (Not mlFlag) Then Exit Sub
   Call mciSendString(StrPtr("close MyMp3"), 0&, 0&, 0&)
   mlFlag = vbFalse
End Sub

Private Sub Command1_Click()
   Call PlayMp3
End Sub

Private Sub Command2_Click()
   Call StopMp3
End Sub

Private Sub Form_Load()
   mlFlag = vbFalse
  'strFile = "F:\Mp3\爱江山更爱美人.mp3"  ' 256Kbps(VBR) 05:19
   strFile = "F:\Mp3\半生缘.mp3"          ' 128Kbps      02:13
End Sub

Private Sub Form_Unload(Cancel As Integer)
   If (mlFlag) Then Call StopMp3
End Sub
StrPtr 这个函数在哪里?[/quote] 在 MSVBVM60.dll 中啊。  你问这个有何意义? 估计你根本不知道VB6的那三个 xxxPtr( )函数、及其作用吧! 说个“正题”: VB6中用到的跟“String”I相关的API函数,大家基本都是用的“A版函数”;   而我都是用的“W版”(特定条件下只能用A版的除外)。 你没看到 mciSendString( )函数的第2个参数,在“一般”用法中都是 String类型的吗!而我用的是 Long类型。 用“W版API”的好处,是避免字符编码转换、提高代码运行效率。 因为在Windows内部,基本都是基于“W版函数”来操作的,   大多数“A版”只是一个“包装”而已(为了兼容性),在A版函数内把字符串数据转换成W版的、再调用W版完成操作。 在VB6中如果用A版的API,很可能造成“字符串数据”的多次编码转换: 在“调用前”,VB6把字符串数据“从W转A”放入“缓冲区”,传给API;  进入API,在API中又“从A转W”,再去调用W版;  如果有“字符串返回值”,在“API返回前”,把字符串数据“从W转A”返回给“调用者(VB6)”; 调用API返回后,VB6又会把“缓冲区”中的字符串数据,“从A转W”返还给相应参数。 而我用W版的API,就从根源上防止了这些累赘的转换操作。
yanghao1 2018-04-19
  • 打赏
  • 举报
回复
引用 1 楼 Chen8013 的回复:
看楼主之前已经发过好几个地方了,似乎都没解决啊………… 给你一段代码参考一下。 打开某Mp3文件、从头到尾全部播放,是没问题的。 我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" ( _
                           ByVal lpstrCommand As Long, _
                           ByVal lpstrReturnString As Long, _
                           ByVal uReturnLength As Long, _
                           ByVal hwndCallback As Long) As Long

Private strFile   As String
Private mlFlag    As Long

Private Sub PlayMp3()
   Dim strOpenCMD As String
   Dim strPlayCMD As String

   mlFlag = vbTrue
   strOpenCMD = "open " & strFile & " Alias MyMp3"
   strPlayCMD = "play MyMp3 from 15000 to 120000"
   ' 从15秒处开始播放到120秒处(命令串中的时间单位是ms)
   ' 不过发现很不靠谱:128Kbps固定码率的那首歌基本正确;另一首256Kbps变比码率的“差之千里”
   Call mciSendString(StrPtr(strOpenCMD), 0&, 0&, 0&)
   Call mciSendString(StrPtr(strPlayCMD), 0&, 0&, 0&)
End Sub

Private Sub StopMp3()
   If (Not mlFlag) Then Exit Sub
   Call mciSendString(StrPtr("close MyMp3"), 0&, 0&, 0&)
   mlFlag = vbFalse
End Sub

Private Sub Command1_Click()
   Call PlayMp3
End Sub

Private Sub Command2_Click()
   Call StopMp3
End Sub

Private Sub Form_Load()
   mlFlag = vbFalse
  'strFile = "F:\Mp3\爱江山更爱美人.mp3"  ' 256Kbps(VBR) 05:19
   strFile = "F:\Mp3\半生缘.mp3"          ' 128Kbps      02:13
End Sub

Private Sub Form_Unload(Cancel As Integer)
   If (mlFlag) Then Call StopMp3
End Sub
StrPtr 这个函数在哪里?
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
我的方法,应该对“固定码率”的Mp3都能正常控制的; 那个“时间片段控制”可能只是不适用于“可变码率”的Mp3。 可变码率的Mp3基本只用于音乐Mp3的压缩转换的,一般“录音设备”都是用固定码率,用可变码率的设备应该很稀少。
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
楼主,你可以结贴了。
yanghao1 2018-04-19
  • 打赏
  • 举报
回复
我2008年就改学C#了,VB6已经忘得差不多了,这才来拜访兄弟。
舉杯邀明月 2018-04-18
  • 打赏
  • 举报
回复
看楼主之前已经发过好几个地方了,似乎都没解决啊………… 给你一段代码参考一下。 打开某Mp3文件、从头到尾全部播放,是没问题的。 我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" ( _
                           ByVal lpstrCommand As Long, _
                           ByVal lpstrReturnString As Long, _
                           ByVal uReturnLength As Long, _
                           ByVal hwndCallback As Long) As Long

Private strFile   As String
Private mlFlag    As Long

Private Sub PlayMp3()
   Dim strOpenCMD As String
   Dim strPlayCMD As String

   mlFlag = vbTrue
   strOpenCMD = "open " & strFile & " Alias MyMp3"
   strPlayCMD = "play MyMp3 from 15000 to 120000"
   ' 从15秒处开始播放到120秒处(命令串中的时间单位是ms)
   ' 不过发现很不靠谱:128Kbps固定码率的那首歌基本正确;另一首256Kbps变比码率的“差之千里”
   Call mciSendString(StrPtr(strOpenCMD), 0&, 0&, 0&)
   Call mciSendString(StrPtr(strPlayCMD), 0&, 0&, 0&)
End Sub

Private Sub StopMp3()
   If (Not mlFlag) Then Exit Sub
   Call mciSendString(StrPtr("close MyMp3"), 0&, 0&, 0&)
   mlFlag = vbFalse
End Sub

Private Sub Command1_Click()
   Call PlayMp3
End Sub

Private Sub Command2_Click()
   Call StopMp3
End Sub

Private Sub Form_Load()
   mlFlag = vbFalse
  'strFile = "F:\Mp3\爱江山更爱美人.mp3"  ' 256Kbps(VBR) 05:19
   strFile = "F:\Mp3\半生缘.mp3"          ' 128Kbps      02:13
End Sub

Private Sub Form_Unload(Cancel As Integer)
   If (mlFlag) Then Call StopMp3
End Sub
舉杯邀明月 2018-04-18
  • 打赏
  • 举报
回复
引用 2 楼 chewinggum 的回复:
[quote=引用 1 楼 Chen8013 的回复:] 看楼主之前已经发过好几个地方了,似乎都没解决啊………… 给你一段代码参考一下。 打开某Mp3文件、从头到尾全部播放,是没问题的。 我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit

' . . . . . . . 
' . . . . . . .

Private Sub Form_Unload(Cancel As Integer)
   If (mlFlag) Then Call StopMp3
End Sub
因为有winmm.dll的时候128K已经很牛逼了。到有256K的时候微软认为已经没人用winmm.dll了[/quote] 不是吧…… 记得10几年前,WinXP横行、Win98/Me 也有不少人在用的时候, 128Kbps的Mp3就是“绝大多数”了啊,有少数是96Kbps的;所以128的并不是“很牛逼”,而是很普通。 那时“音质好一点”的基本就是192的了,但也“并不难找”啊。 我看“没人用”的重要原因,是它的这些文档资料,太难理解了。 再有一点就是它“没随主流”进行升级,支持的格式比较少,无法满足“高品质(音质、音效)”的追求。
脆皮大雪糕 2018-04-18
  • 打赏
  • 举报
回复
引用 1 楼 Chen8013 的回复:
看楼主之前已经发过好几个地方了,似乎都没解决啊………… 给你一段代码参考一下。 打开某Mp3文件、从头到尾全部播放,是没问题的。 我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" ( _
                           ByVal lpstrCommand As Long, _
                           ByVal lpstrReturnString As Long, _
                           ByVal uReturnLength As Long, _
                           ByVal hwndCallback As Long) As Long

Private strFile   As String
Private mlFlag    As Long

Private Sub PlayMp3()
   Dim strOpenCMD As String
   Dim strPlayCMD As String

   mlFlag = vbTrue
   strOpenCMD = "open " & strFile & " Alias MyMp3"
   strPlayCMD = "play MyMp3 from 15000 to 120000"
   ' 从15秒处开始播放到120秒处(命令串中的时间单位是ms)
   ' 不过发现很不靠谱:128Kbps固定码率的那首歌基本正确;另一首256Kbps变比码率的“差之千里”
   Call mciSendString(StrPtr(strOpenCMD), 0&, 0&, 0&)
   Call mciSendString(StrPtr(strPlayCMD), 0&, 0&, 0&)
End Sub

Private Sub StopMp3()
   If (Not mlFlag) Then Exit Sub
   Call mciSendString(StrPtr("close MyMp3"), 0&, 0&, 0&)
   mlFlag = vbFalse
End Sub

Private Sub Command1_Click()
   Call PlayMp3
End Sub

Private Sub Command2_Click()
   Call StopMp3
End Sub

Private Sub Form_Load()
   mlFlag = vbFalse
  'strFile = "F:\Mp3\爱江山更爱美人.mp3"  ' 256Kbps(VBR) 05:19
   strFile = "F:\Mp3\半生缘.mp3"          ' 128Kbps      02:13
End Sub

Private Sub Form_Unload(Cancel As Integer)
   If (mlFlag) Then Call StopMp3
End Sub
因为有winmm.dll的时候128K已经很牛逼了。到有256K的时候微软认为已经没人用winmm.dll了
舉杯邀明月 2018-04-18
  • 打赏
  • 举报
回复
刚才又测试了1首: 永远永远.mp3 这首是 320 Kbps  05:36 它的“时间控制”是准确的(我跟另一个 Mp3播放器“同步播放”比较的)。 我觉得 winmm.dll 应该是对“可变码率”的Mp3无法准确识别和“定位”。 上面提到的“半生缘.mp3”和“永远永远.mp3”都是固定码率的Mp3 。 我昨天晚上测试 《爱江山更爱美人》时,发现它返回的“曲目长度(总时长)”也根本不对。 估计楼如果那些“录音”是固定码率的Mp3,应该可以用我的方法解决了。
赵4老师 2018-04-18
  • 打赏
  • 举报
回复
推荐使用NCTAudioStudio控件处理音频。

809

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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