Awesome! Thank you. <br><br>The stupid bug in my code was:<br>Port ! {Port, {command, Data}}<br>instead of:<br>Port ! {self(), {command, Data}}<br><br>It works perfectly. <br><br><br><br>Sergej<br><br><br><div class="gmail_quote">
On Sun, Oct 26, 2008 at 3:48 PM, Edwin Fine <span dir="ltr"><<a href="mailto:emofine@gmail.com">emofine@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr">Sergey,<br><br>I tried to write an email about this, but found it easier just to write a program. It's only 70 lines, so here it is. It's maybe not the best code, but I did crank it out as fast as I could, and it does seem to work. I haven't actually tested the binary output to see if it's complete and correct, but if you specify a file name it does write to the file with no complaints.<br>

<br>I hope it helps.<br><br>Example usage:<br><br><span style="font-family: courier new,monospace;">{ok,Bin} = file:read_file("/backups/mp3/Allan Holdsworth/Allan Holdsworth - Devil take the hindmost.mp3"),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">Opts = [{fmt_in,"mp3"},{fmt_out,"flv"},{file_out,"-"},{stderr_redirect,{file,"/tmp/dtth.out"}],</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">{ok, Results} = ffmpeg:convert(Bin,Opts).</span><br style="font-family: courier new,monospace;">-----------------------<br><span style="font-family: courier new,monospace;">-module(ffmpeg).</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">-author("Edwin Fine").</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-export([convert/2, print_responses/1]).</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% Params are in proplists format:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% [Opt] - All opts are mandatory except for overwrite, which defaults to false</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%% Opt = {fmt_in, string()}</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%%       {fmt_out, string()} - must be provided</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%       {file_out, string()} - may be "-", in which case the list of binaries returned will contain the data</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%       {overwrite, true|false} - default true</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%%       {stderr_redirect, {file, string()} | stdin | bit_bucket} - Either redirects stderr to a given file, to stdin, or /dev/nul</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%       {extra, string()} - free format parameters</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%% If file_out is set to "-", stderr_redirect should really be to file or bit_bucket or the returned data will be corrupt</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% Example:</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% Opts = [{fmt_in, "mp3"}, {fmt_out, "flv"}, {file_out, "/tmp/test.flv"}]</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% -> [binary()]</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">%% Returns a list of binaries output by ffmpeg.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">%%</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">convert(InputBinary, Opts) when is_binary(InputBinary), is_list(Opts) -></span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Prog = "/usr/local/bin/ffmpeg",</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    FmtIn = proplists:get_value(fmt_in, Opts),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    FmtOut = proplists:get_value(fmt_out, Opts),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    FileOut = proplists:get_value(file_out, Opts),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Extra = proplists:get_value(extra, Opts, ""),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    OverWrite = overwrite(proplists:get_value(overwrite, Opts, false)),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Redirect = format_redirect(proplists:get_value(stderr_redirect, Opts, {file, "/tmp/ffmpeg.out"})),</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    PortCmd = build_port_cmd(Prog, FmtIn, FmtOut, OverWrite, FileOut, Redirect, Extra),</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Port = open_port({spawn, PortCmd}, [binary, use_stdio, stream]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    port_command(Port, InputBinary),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Responses = response_reader(Port),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    port_close(Port),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    Responses.</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">print_responses(Msgs) -></span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    io:format("~s~n", [binary_to_list(list_to_binary(Msgs))]).</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">response_reader(Port) -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    response_reader_loop(Port, []).</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">response_reader_loop(Port, L) -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    receive</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        {Port, {data, Bin}} -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            response_reader_loop(Port, [Bin|L]);</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        Other -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            io:format("Unexpected: ~p~n", [Other]),</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">            response_reader_loop(Port, L)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    after</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        1000 -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            {ok, lists:reverse(L)}</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    end.</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">build_port_cmd(Prog, FmtIn, FmtOut, OverWrite, FileOut, Redirect, Extra) -></span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    lists:concat([</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            Prog, " -f ", FmtIn, " -i - ", OverWrite, " -f ",</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">            FmtOut, " ", FileOut, " ", Extra, Redirect]<br>    ).</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">overwrite(true)  -> "-y";</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">overwrite(false) -> "".</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">format_redirect({file, File}) -> " 2>" ++ File;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">format_redirect(stdin)        -> " 2>&1";</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">format_redirect(bit_bucket)   -> " 2>/dev/null".</span><br style="font-family: courier new,monospace;">---------------<br><br><div class="gmail_quote">2008/10/25 Rapsey <span dir="ltr"><<a href="mailto:rapsey@gmail.com" target="_blank">rapsey@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="Wj3C7c">What is the difference for the program that communicates using stdin and stdout, if it is opened using open_port from within erlang or with unix pipes?<br>

I'm trying to use open_port with ffmpeg, this works just fine for instance:<br>
<br>cat blabla.mp3 | /opt/local/bin/ffmpeg -f mp3 -i - -acodec libfaac -f flv -  > dan.flv<br><br>But if I use open_port:<br>{ok, Bin} = file:read_file("blabla.mp3"),<br>Port = open_port({spawn, "/opt/local/bin/ffmpeg -f mp3 -i - -acodec libfaac -f flv -"}, [binary, use_stdio, stream]),<br>


<<Data:128000/binary, Remain/binary>> = Bin,<br>Port ! {Port {command, Data}}<br><br>ffmpeg call will fail with:<br>pipe:: Error while opening file<br><br><br><br>/Sergej<br>
<br></div></div>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br></div>
</blockquote></div><br>