2012-01-09 35 views
26

我有一些.MP4視頻文件,必須在Android活動的VideoView中讀取。這些視頻包含多個音軌,每個音軌對應一種用戶語言(例如:英語,法語,日語......)。
我遇到意想不到的麻煩,找到任何幫助或文檔來提供這樣的功能。我目前能夠加載視頻並使用MediaController在VideoView中播放,但不能更改音頻軌道。

我不確定Android SDK提供了什麼簡單的方法來做到這一點,這讓我對如何解決問題感到無能爲力。我正在考慮提取每個音頻軌道,根據語言將我想要的音頻加載到MediaPlayer中,然後將音頻和視頻一起播放。但是我擔心會出現一些同步問題,並阻止我這樣做。

如果您有任何線索,有任何建議可以幫助我開始解決這個問題,那麼您非常歡迎。Android:VideoView中有多個音軌?

+0

這方面的進展如何? – runor49 2012-03-06 21:54:42

+0

您似乎已根據所選解決方案的評論取得了進展。你能分享你如何完成上述任務嗎? – LostPuppy 2016-04-05 00:30:08

+0

這是一個古老的問題,但有一個簡單的解決方案來解決這個問題。看到我的答案。 – 2016-06-19 15:17:48

回答

3

還沒有測試過自己,但看起來Vitamio庫支持多音軌(以及其他有趣的功能)。它與Android的VideoView類API兼容。

也許你將不得不使用VitamioVideoView.setAudioTrack()設置音軌(例如基於區域設置)。詳情請參閱Vitamio API docs

+0

最後我做了我所建議的。我分離了視頻和音頻數據,根據用戶語言將音頻加載到MediaPlayer中,然後同步兩個流。這是一個相當骯髒的解決方案,但在我不得不做這項工作的時候可以接受。 我還沒有測試過您的解決方案,但我會接受它,因爲它似乎正是我當時所需要的。不管怎樣,謝謝你 ! – Vahron 2013-03-18 10:01:46

-1

VideoView類無法支持您的require.U必須解析以獲取音頻流數據(您想要)與Java層上的AudioTrack類一起播放。需要

+0

不正確。看到我的答案。 – 2016-06-19 15:16:03

3

任何第三方庫:

mVideoView.setVideoURI(Uri.parse("")); // set video source  

mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     MediaPlayer.TrackInfo[] trackInfoArray = mp.getTrackInfo(); 
     for (int i = 0; i < trackInfoArray.length; i++) { 
      // you can switch out the language comparison logic to whatever works for you 
      if (trackInfoArray[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_AUDIO 
       && trackInfoArray[i].getLanguage().equals(Locale.getDefault().getISO3Language()) { 
       mp.selectTrack(i); 
       break; 
      } 
     } 
     return true; 
    } 
}); 

據我可以告訴 - 音軌,應在3個字母的ISO 639-2進行編碼,以正確識別。

+0

你能指點我如何編碼這些音軌 – 2017-01-14 06:29:05

+0

ffmpeg是一個很好的開始的地方 – 2017-01-15 07:23:17

+0

你寫道,音軌應該用3字母iso 639-2編碼。你能解釋一下它是什麼嗎? – 2017-01-15 15:30:11