2013-04-21 38 views
3

如何以編程方式將mp4視頻文件格式轉換(提取音頻通道)?
我只是無法在網上找到任何東西,因爲使用C++。
我該如何動態鏈接外部引擎,我可以通過C++取得mp4文件並將其轉換爲mp3文件。
而不是將命令行參數傳遞給LAME或MPLAYER或FFMPEG?使用C++從mp4中提取音頻到mp3(不執行帶有參數的ffmpeg)

+0

LAME和FFMPEG是開源項目,所以我建議你先看看他們的來源,以便讓你開始。 – 2013-04-21 14:45:59

+0

如何使用ffmpeg API?從頭開始實施這聽起來很困難。 – Thibaut 2013-04-21 16:18:17

+1

FFMPEG有API嗎? – user63898 2013-04-21 18:51:16

回答

8

您可以嘗試使用ffmpeg在c或C++中執行此操作。這是正常的步驟流程。

  1. 使用av_register_all()初始化ffmpeg;

  2. 使用avformat_open_input打開輸入文件(& informat,sourcefile,0,0))。

  3. 使用avformat_find_stream_info(informat,0))查找流信息)。

  4. 通過迭代流並將codec_type與AVMEDIA_TYPE_AUDIO進行比較來查找音頻流。

  5. 一旦你輸入了音頻流,你可以找到音頻解碼器並打開解碼器。使用avcodec_find_decoder(in_aud_strm-> codec-> codec_id)和avcodec_open2(in_aud_codec_ctx,in_aud_codec,NULL)。

  6. 現在輸出文件猜測使用av_guess_format(NULL,(const char *)outfile,NULL)的格式。

  7. 爲outformat分配上下文。

  8. 使用avcodec_find_encoder(outfmt-> audio_codec)查找輸出音頻編碼器。

  9. 添加新的流音頻流avformat_new_stream(outformat,out_aud_codec)。使用avio_open具有期望的採樣率,採樣FMT,信道等

  10. 打開輸出文件

  11. 填充輸出編解碼器的上下文()。

  12. 使用avformat_write_header(outformat,NULL)編寫輸出標題。

  13. 現在在while循環開始讀取數據包時,只解碼音頻數據包將它們編碼並將它們寫入打開的輸出文件中。您可以使用av_read_frame(informat,& pkt),avcodec_decode_audio4(in_aud_codec_ctx,pframeT,& got_vid_pkt,& pkt),avcodec_encode_audio2()和av_write_frame()。

  14. 最後使用av_write_trailer編寫預告片。

您可以查看ffmpeg示例中提供的demuxing.c和muxing.c。

+0

謝謝,我會嘗試。我徘徊,如果有一些開源應用程序已經做好了 – user63898 2013-04-23 13:15:30

相關問題