Gstreamer を使用してテレビ局から録画するアプリを作成します。
パイプラインは次のようにファイルシンクを作成します:
#include <gio/gio.h>
Encoder* recording_start (const char* filename)
{
------------------------------------------------------------
GstElement *filesink;
gchar *path;
filesink = gst_element_factory_make ("filesink", NULL);
g_return_val_if_fail (filesink != NULL, NULL);
path = g_strdup_printf("%s.mov", filename);
g_object_set(G_OBJECT(filesink), "location", path, NULL);
gst_bin_add_many (GST_BIN (pipeline), source, encodebin, filesink, NULL);
if (!gst_element_link_many (source, encodebin, filesink, NULL)) {
gst_object_unref (pipeline);
g_return_val_if_reached (NULL);
}
gst_element_set_state (pipeline, GST_STATE_PLAYING);
Encoder *encoder = g_malloc0(sizeof(Encoder));
Encoder->filename = path;
return encoder;
}
録音ステーションのファイル名は次のように生成されます。
/* args for this format are:
* path
* station title
* time
*/
char *filename = g_strdup_printf (_("%s/%s_%s.mov"), destination, station, time);
記録されたファイルに関する情報を照会するために GFile を使用します (記録ファイルへのポインタ):
file = g_file_new_for_path (encoder->filename);
ユーザーは、コンボ ボックスから録音したいステーションを選択できます。
--------------
| STATION 1 |
--------------
| STATION 2 |
--------------
| STATION 3 |
--------------
ステーション名に次の文字の組み合わせが含まれている場合: "< /" 例:
-----------------------
| Canal Algérie </ 10 |
-----------------------
アプリケーション取得エラー:
ERROR: from element /GstFileSink:filesink3: Could not open file "/home/ubuntu/</_20130728-044308.mov" for writing.
Additional debug info:
gstfilesink.c(420): gst_file_sink_open_file (): /GstPipeline:pipeline/GstFileSink:filesink3:
system error: No such file or directory
そしてクラッシュ
元のファイル パスに予約文字が含まれているか存在しない場合にアプリがクラッシュするのはなぜですか (GIO は有効なパスを返します)。
駅名「Canal Algérie / 10」から「<」を削除すると、問題なくアプリがクラッシュしなくなります。
ありがとう