[英]How to encode H.264 video using FFmpeg C API and then open the output with a media player?
[英]FFmpeg API example (encode_video.c) does not work correctly
我正在使用官方encode_video.c示例來測試 FFmpeg 是否適合我。 我從ffmpeg.zeranoe.com/builds獲得了預構建的 windows 版本。 它已經使用 libx264 和其他外部庫構建。 我同時獲得了開發版和共享版,並在 Visual Studio 中相應地添加了 DLL、header 文件和庫。
現在 encode_video.c 示例無法正常工作。
我嘗試了什么:
我編譯了示例並在許多不同的文件格式和編解碼器上運行它,如下所示。
首先,我嘗試了所有這些文件格式(.mp4、.m4v、.h264、.x264、.avi、.flv),編解碼器名稱為 libx264。 代碼執行無誤,但 output 視頻文件未在 VLC 或 Windows 10 默認播放器中播放。
接下來,我嘗試了上述所有文件格式,但編解碼器名稱為 mpeg4。 代碼執行無誤,但 output 視頻文件僅在 VLC 中播放.m4v 。
什么是預期的:
所有這些組合都應該產生一個可以在 VLC 中播放的視頻文件。 除了.m4v作為文件格式和mpeg4作為編解碼器名稱外,它們都不起作用。
請告訴我如何使它適用於 h264。 我主要希望它適用於 h264,因為這只是目前重要的。
我正在運行類似./encode_video.exe test.mp4 libx264
的代碼,其中第一個參數是 output 文件名,第二個參數是編解碼器名稱。
這是用於 test.mp4 和 libx264 的 output 作為命令行 arguments https://imgur.com/a/AHLQwuK
似乎在encode
function 中,它遍歷下面的代碼並由於 AVERROR(EAGAIN) 或 AVERROR_EOF 而返回。 請告訴我發生了什么事。
while (ret >= 0) {
ret = avcodec_receive_packet(enc_ctx, pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error during encoding\n");
exit(1);
}
printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
fwrite(pkt->data, 1, pkt->size, outfile);
av_packet_unref(pkt);
}
我使用 DepenciesGUI 找出鏈接的 DLL,它顯示 DLL 已正確鏈接。 請幫我弄清楚現在的問題是什么!!
我發現這個問題是因為我遇到了同樣的問題(無法觀看該示例生成的視頻)。 關於您的擔憂:
似乎在編碼 function 中,由於 AVERROR(EAGAIN) 或 AVERROR_EOF,它會遍歷以下代碼並返回。 請告訴我發生了什么。
在調試器中單步執行代碼時,我也注意到了那些偶爾出現的“錯誤”。 但是,這些幀最終會在隨后的循環迭代中或在編碼器通過以下方式閃爍時進行處理:
/* flush the encoder */
encode(c, NULL, pkt, f);
我也嘗試使用 VLC 和 QuickTime,但沒有成功。
然后我注意到 ffmpeg 的 bin 文件夾中的 ffplay 工具,它可以播放該示例生成的所有視頻,使用不同的編解碼器。
我的觀點是——問題可能出在觀眾身上,而不是視頻文件上。
只是改變:
./encode_video.exe test.mp4 libx264
至:
./encode_video.exe test.264 libx264
結果文件“test.264”可以通過vlc播放器播放。
我在我的 Mac 上運行 ffmpeg 的 encode_video.c 演示,Apple 的 QuickTime Player 似乎不支持這種格式。
您想要改用 muxing.c 示例。
encode_video 示例不生成 MPEG 兼容文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.