2017-05-08 10 views
0

FFMPEGを使用してオーディオファイルを読み込み、そのファイルを 'C'プログラムで処理して出力する短い 'C'プログラムを作成しようとしています。 FFMEPG経由のファイル。FFMPEGのshowwavesフィルタを使用して、新しい変更済みのオーディオとVideo表現を結合します。現在オーディオファイルをFFMPEGにパイプしてビデオファイルを生成する 'C'プログラム

プログラムは次の手順を実行しようとする: - pipein FFMPEG thorugh II)「C」の部分を使用してオーディオファイルを処理使って、オーディオファイルの

I)読み出されたプログラムIII )変更されたオーディオをFFMPEGにパイプし、FFMEPGの 'showwaves'フィルタを使用してファイルを生成し、オーディオとビデオを含むMP4ファイルを作成します。

次のコードの実行FFMPEGでommandラインは、私が作成したいオーディオ/ビデオのMP4を生成形成: -

ffmpeg -y -f s16le -ar 44100 -ac 1 -i 12345678.wav -i 12345678.wav -filter_complex "[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" -map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 12345678.mp4 

このコードは、処理されたオーディオファイルを生成し、に出力します。必要に応じて、.wavファイル: -

#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 

void main() 
{ 
// Launch two instances of FFmpeg, one to read the original WAV 
// file and another to write the modified WAV file. In each case, 
// data passes between this program and FFmpeg through a pipe. 
FILE *pipein; 
FILE *pipeout; 
pipein = popen("ffmpeg -i 12345678.wav -f s16le -ac 1 -", "r"); 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - out.wav", "w"); 

// Read, modify and write one sample at a time 
int16_t sample; 
int count, n=0; 
while(1) 
{ 
    count = fread(&sample, 2, 1, pipein); // read one 2-byte sample 
    if (count != 1) break; 
    ++n; 
    sample = sample * sin(n * 5.0 * 2*M_PI/44100.0); 
    fwrite(&sample, 2, 1, pipeout); 
} 

// Close input and output pipes 
pclose(pipein);  
pclose(pipeout); 
} 

(テッド・バークの素晴らしいポストhereから借りたこのコード)

下図のように、私は試みを行ったが、これは動作しません: -

#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 

void main() 
{ 
// Launch two instances of FFmpeg, one to read the original WAV 
// file and another to write the modified WAV file. In each case, 
// data passes between this program and FFmpeg through a pipe. 
FILE *pipein; 
FILE *pipeout; 
pipein = popen("ffmpeg -i 12345678.wav -f s16le -ac 1 -", "r"); 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i 12345678.wav -i 
12345678.wav -filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 
", "w"); 


// Read, modify and write one sample at a time 
int16_t sample; 
int count, n=0; 
while(1) 
{ 
    count = fread(&sample, 2, 1, pipein); // read one 2-byte sample 
    if (count != 1) break; 
    ++n; 
    sample = sample * sin(n * 5.0 * 2*M_PI/44100.0); 
    fwrite(&sample, 2, 1, pipeout); 
} 

// Close input and output pipes 
pclose(pipein);  
pclose(pipeout); 
}  

理想的には、誰かが上記pipeoutコマンドの改良版を提案することができます - これは面白い

だろう達成するために、交互に別のプロセスを@Mulvyaへ

* EDIT *

おかげで、改訂pipeoutラインは現在、次のとおりです。 -

pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - -filter_complex "[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" -map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 12345678.mp4 

"、" w ");私は次のエラーメッセージを取得gccでコンパイルするには

: - ここに

avtovid2.c: In function \u2018main\u2019: 

wavtovid2.c:13:83: error: expected \u2018]\u2019 before \u2018:\u2019 
token 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 

^ 
wavtovid2.c:13:86: error: expected \u2018)\u2019 before 
\u2018showwaves\u2019 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 

^ 
wavtovid2.c:13:98: error: invalid suffix "x720" on integer constant 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 

^ 
wavtovid2.c:13:153: warning: missing terminating " character 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 

^ 
wavtovid2.c:13:86: error: missing terminating " character 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 

^ 
wavtovid2.c:14:6: warning: missing terminating " character 
", "w"); 
^
wavtovid2.c:14:1: error: missing terminating " character 
", "w"); 
^ 
wavtovid2.c:13:21: warning: passing argument 1 of \u2018popen\u2019 makes 
pointer from integer without a cast 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 
       ^
In file included from wavtovid2.c:1:0: 
/usr/include/stdio.h:872:14: note: expected \u2018const char *\u2019 but 
argument is of type \u2018char\u2019 
extern FILE *popen (const char *__command, const char *__modes) __wur; 
     ^
wavtovid2.c:13:15: error: too few arguments to function \u2018popen\u2019 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - - 
filter_complex " 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" -map "[v]" 
-map 1:a:0 -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p - 
codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart 
12345678.mp4 
     ^
In file included from wavtovid2.c:1:0: 
/usr/include/stdio.h:872:14: note: declared here 
extern FILE *popen (const char *__command, const char *__modes) __wur; 
     ^
wavtovid2.c:32:1: error: expected \u2018;\u2019 before \u2018}\u2019 
token 
} 
+0

あなたはパイプから読み込んでいますが、2番目のコマンドはパイプではなくファイルから読み込みます。パイプアウトでの入力は '-f s16le -ar 44100 -ac 1 -i -'でなければなりません。また、オーディオを '-map 0:a'のように再利用してマップすることもできます。 2番目の入力をフィードする必要はありません。最後に、ffmpegはその場でファイルを編集しないので、入力ファイルと出力ファイルは同じにすることはできません。 – Mulvya

+0

入力@Mulvyaをありがとう - 確かに入力ファイルの読みは間違っていた。オーディオのマッピングに関しては、コマンドをFFMEPG内で正しく実行するためには、オーディオとビデオ入力ファイルの両方を宣言する必要があることがわかっています。そうでなければ、 'showwaves'はオーディオソースからビデオを生成しません。それでも、喜んではありません.cfコンパイラは、ffpmegコマンドの構文でいくつかのエラーを見つけます。 – soflow

+0

filter_complex文字列の二重引用符を削除し、 '-map 1:a:0'を' -map 0:a'に変更してください。 – Mulvya

答えて

0

は作業バージョンがある - 元のコードのための助けを@Mulvyaのおかげで、テッド・バーク。

このプログラムは、FFMPEG経由で12345678.wavファイルを読み込み、そのファイルを 'C'で処理してトレモロエフェクトを生成し、12345678.mp4という名前のビデオファイルに出力します。 FFMEPG「showwaves」フィルタ: -

#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 

void main() 
{ 
// Launch two instances of FFmpeg, one to read the original WAV 
// file and another to write the modified WAV file. In each case, 
// data passes between this program and FFmpeg through a pipe. 
FILE *pipein; 
FILE *pipeout; 
pipein = popen("ffmpeg -i 12345678.wav -f s16le -ac 1 -", "r"); 
pipeout = popen("ffmpeg -y -f s16le -ar 44100 -ac 1 -i - -filter_complex 
[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v] -map [v] - 
map 0:a -codec:a aac -strict -2 12345678.mp4", "w"); 


// Read, modify and write one sample at a time 
int16_t sample; 
int count, n=0; 
while(1) 
{ 
    count = fread(&sample, 2, 1, pipein); // read one 2-byte sample 
    if (count != 1) break; 
    ++n; 
    sample = sample * sin(n * 5.0 * 2*M_PI/44100.0); 
    fwrite(&sample, 2, 1, pipeout); 
    } 

    // Close input and output pipes 
    pclose(pipein);  
    pclose(pipeout); 
} 

これはまだFFMPEGパイプの限界を理解し、出力ファイル指定を改善するために、いくつかの作業を必要としています。

このプログラムの目的は、 'C'でオーディオファイルを受け入れて処理できるプログラムを開発する最初のステップとして役立ち、FFMPEGを使用してオーディオとビデオの結合出力を生成します。

関連する問題