2011-11-07 602 views
2

我在另一個問題中詢問(http://stackoverflow.com/questions/8012494/sorry-this-video-cannot-be-played-streaming-mp4-to-android/8012874#8012874)使用VideoView在Android中進行視頻播放。顯然,問題在於我的視頻編碼方式,因爲使用我的代碼播放另一個視頻(網絡上的512Kb mp4)正確播放。由於視頻是由我的最終用戶上傳到網站的,因此我沒有對視頻本身的任何控制權,但是我可以控制對這些視頻進行重新編碼。我使用ffmpeg將它們重新編碼爲標準MP4(H.264 + AAC)格式,並將它們縮放到相同尺寸(320x240)。使用ffmpeg進行視頻重新編碼

這裏有一個視頻的ffmpeg的信息,不會玩:

sh-3.2$ ffmpeg -i video.bad.mp4 
FFmpeg version SVN-r25679-snapshot, Copyright (c) 2000-2010 the FFmpeg developers 
    built on Nov 5 2010 09:34:37 with gcc 4.3.2 
    configuration: --prefix=/usr --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-libgsm --enable-x11grab --enable-libx264 --enable-libtheora --extra-cflags=-Wall --enable-swscale --enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping --enable-avfilter --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --enable-nonfree --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 
    libavutil  50.32. 6/50.32. 6 
    libavcore  0.12. 0/0.12. 0 
    libavcodec 52.94. 3/52.94. 3 
    libavformat 52.84. 0/52.84. 0 
    libavdevice 52. 2. 2/52. 2. 2 
    libavfilter 1.56. 0/1.56. 0 
    libswscale  0.12. 0/0.12. 0 
    libpostproc 51. 2. 0/51. 2. 0 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.bad.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf52.84.0 
    Duration: 00:00:45.93, start: 0.000000, bitrate: 591 kb/s 
    Stream #0.0(und): Video: h264, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 535 kb/s, 15 fps, 15 tbr, 15 tbn, 30 tbc 
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 51 kb/s 

及這裏的正常播放視頻的ffmpeg的信息:

sh-3.2$ ffmpeg -i video.mp4 
FFmpeg version SVN-r25679-snapshot, Copyright (c) 2000-2010 the FFmpeg developers 
    built on Nov 5 2010 09:34:37 with gcc 4.3.2 
    configuration: --prefix=/usr --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-libgsm --enable-x11grab --enable-libx264 --enable-libtheora --extra-cflags=-Wall --enable-swscale --enable-libdc1394 --enable-nonfree --disable-mmx --disable-stripping --enable-avfilter --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --enable-nonfree --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 
    libavutil  50.32. 6/50.32. 6 
    libavcore  0.12. 0/0.12. 0 
    libavcodec 52.94. 3/52.94. 3 
    libavformat 52.84. 0/52.84. 0 
    libavdevice 52. 2. 2/52. 2. 2 
    libavfilter 1.56. 0/1.56. 0 
    libswscale  0.12. 0/0.12. 0 
    libpostproc 51. 2. 0/51. 2. 0 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: mp41 
    title   : crazytown - http://www.archive.org/details/Cartoon-Crazytown 
    encoder   : Lavf51.10.0 
    Duration: 00:07:50.40, start: 0.000000, bitrate: 578 kb/s 
    Stream #0.0(und): Video: h264, yuv420p, 320x240, 510 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc 
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 63 kb/s 

我有兩個問題在這裏,實際上。首先,我的「壞」視頻中的哪些細節確實不像android?其次,我應該使用哪些參數與ffmpeg重新編碼我的視頻?由於目前我用這個:

ffmpeg -i $input_video_file -y -s 320x240 -vcodec libx264 -vpre medium -acodec libfaac -b 510K -ar 48000 -aspect 4:3 $tmpfile.mp4 
qt-faststart $tmpfile.mp4 $output_video_file.mp4 

但是,這會產生一個視頻,這不是在Android上播放。任何幫助是極大的讚賞。

+0

嗨,Aleks,我可以問你,你是如何成功在Android中運行FFmpeg命令的?這對我很重要。謝謝。 – iSun

+0

@iSun我不在android中運行命令。 FFmpeg在我的網絡服務器上運行,然後通過android設備檢索視頻。 –

+0

啊哈,你知道在android中運行命令的方式嗎? – iSun

回答

6

首先,您的ffmpeg版本已超過一年。自去年以來,使用ffmpeg和H.264進行了很多改進。請嘗試升級至少ffmpeg-0.7。

確切地說出問題的原因有點難,因爲ffmpeg沒有顯示傳遞給H.264編碼的所有選項。嘗試提高ffmpeg輸出的詳細程度(在ffmpeg命令開始附近的某處使用-v 1-v 2)。但根據我使用ffmpeg爲Android進行視頻轉碼的經驗,我的猜測是您沒有使用H.264 Baseline配置文件(如果您好奇,請參閱the wikipedia article on H.264)。如果您有ffmpeg-0.7或更高版本,請嘗試添加-profile baseline

如果由於某種原因無法升級ffmpeg,則可以在指定-vpre medium後,通過使用-vpre baseline選項指定基準配置文件。如果由於某種原因嘗試使用基線預設時出現錯誤,可以通過在-vpre medium之後的命令行上指定-coder 0 -bf 0 -flags2 -wpred-dct8x8來手動強制基線選項。

+0

非常感謝!由於我現在不能升級ffmpeg,所以我不得不與其他選項一起使用。在命令行中添加'-vpre baseline'確實有竅門!它現在在手機上正確播放。 –